R 根据模式选择行名称
有没有更好的方法选择以某物开头的行名?R 根据模式选择行名称,r,dataframe,row,R,Dataframe,Row,有没有更好的方法选择以某物开头的行名? 前 *实际数据帧有8000行。 以下两个选项有效: df[substr(rownames(df),1,3)=='C12',] 或 我想要 df['C12*',] k1 k2 p1 p2 l perda lP lucroVar C12-C13 12.12 13.12 0.48 0.24 0.24 -0.76 0.32 24.00 C12-C43 12.12
前 *实际数据帧有8000行。
以下两个选项有效:
df[substr(rownames(df),1,3)=='C12',]
或
我想要
df['C12*',]
k1 k2 p1 p2 l perda lP lucroVar
C12-C13 12.12 13.12 0.48 0.24 0.24 -0.76 0.32 24.00
C12-C43 12.12 13.62 0.48 0.16 0.32 -1.18 0.27 21.33
在SQL中有“像‘C12%’”为什么你不喜欢你的方法,你说的“更好”是什么意思?更精确的语法还是更快
dplyr
也可以这样做,但实际上更复杂,因为我认为需要将行名转换为显式变量
library(dplyr)
a <- data.frame(a=(1:4), row.names=c("C12","CC12", "C1","12"))
tbl_df(cbind(a=a, b=rownames(a)))%>%
filter(grepl("^C12", b))
库(dplyr)
a%
过滤器(灰色(“^C12”,b))
我不建议这样做,但是
您给出的示例代码实际有效吗?我想你需要一个
which
,例如df[which(substr(rownames(df),1,3)='C12'),]
不需要which()
,因为[
也适用于逻辑变量。前两次尝试应该可以正常工作。您不需要为行名定义额外的列。但在您的示例中,如果不定义,您将遇到麻烦,因为其中一列与数据帧同名。因此:过滤器(a,grepl(^C12),行名(a)))
不起作用,因为在rownames(a)
中,a
被解释为数据框a
中的列a
。但是如果你调用数据框,比如说,df
,这将起作用:过滤器(df,grepl(^C12),rownames(df))
。是的,一个更简洁的代码。在SQL中有“like'C12%”。会这样吗“干预”[]功能,结果不可预测?无论如何,这是一种很好的、未知的定义函数的方法。@Alex非常正确,我已经更新了一个更好的版本为什么函数不能有其他名称,如“[~”@rawr@Alex一个过于简单的解释(部分原因是我不是专家)是执行时,比如说[~
,解析将其解释为两个字符。您当然可以定义一个名为[~
的函数,但必须像`[~`(df,i)那样调用它
这不是您想要的。r还允许您定义运算符,尽管这并不完全是您想要的,但它是另一种奇怪的函数定义和类@rawr!在rTks中调用函数的方式,我喜欢[~(df,I)
:)
df['C12*',]
k1 k2 p1 p2 l perda lP lucroVar
C12-C13 12.12 13.12 0.48 0.24 0.24 -0.76 0.32 24.00
C12-C43 12.12 13.62 0.48 0.16 0.32 -1.18 0.27 21.33
library(dplyr)
a <- data.frame(a=(1:4), row.names=c("C12","CC12", "C1","12"))
tbl_df(cbind(a=a, b=rownames(a)))%>%
filter(grepl("^C12", b))
`[.data.frame` <- function(x, i, ...) {
base::`[.data.frame`(x, if (is.character(i)) grepl(i, rownames(x)) else i, ...)
}
letters[1]
# [1] "a"
mtcars[1, ]
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
mtcars['M', ]
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
# Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
# Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
# Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
# Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
# AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
# Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
rm('[', '[.data.frame')