R 返回行名称的部分匹配。

9
我遇到了以下问题。
vec <- c("a11","b21","c31")
df <- data.frame(a = c(0,0,0), b = c(1,1,1), row.names = vec)
df["a",]

返回

df["a",]
    a b
a11 0 1

然而,

"a" %in% vec 

并且

"a" %in% rownames(df) 

都返回False

当使用字母后跟数字作为行名称时,R允许部分匹配字符串。我已在R v3.2.2和R v3.2.1上复制了这个问题。

df[["a",1,exact=T]]

返回0。

有没有什么我可以设定的东西,使得R不允许这种部分匹配?


1
如果你正在寻找关闭它的选项,那是没有的。类似但相当平淡无奇的https://dev59.com/bmMl5IYBdhLWcg3w5aaQ - Rich Scriven
2个回答

5

奇怪的是,我甚至没有意识到部分匹配是一件事。

不要直接索引数据框,你可以尝试单独识别在行名上完全匹配的记录,并从结果构造一个索引向量,像这样:

> ix <- 'a' == row.names(df)
> df[ix,]
<0 rows> (or 0-length row.names)

或者等价地(但更加简洁):
> df['a' == row.names(df),]

或者,如果你把对象强制转换为 data.table ,它只会返回完全匹配的结果:

> library(data.table)
> dt <- data.table(df)
> dt[,ix := vec]
> setkey(dt, ix)

> dt['a']
    a  b ix
1: NA NA  a

> dt['a11']
   a b  ix
1: 0 1 a11

2

为什么不试试以下方法:

df[grep(pattern = "a", x = rownames(df)),]

这将返回:

> df[grep(pattern = "a", x = rownames(df)),]
    a b
a11 0 1
利用 grep 可以提供更多的灵活性,例如如果你想匹配只包含a的行名:
> df[grep(pattern = "^a$", x = rownames(df)),]
[1] a b
<0 rows> (or 0-length row.names)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接