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 不允许这种部分匹配吗?

4

2 回答 2

5

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

您可以尝试分别识别与 rowname 完全匹配的记录,并从结果中构造一个索引向量,而不是直接索引到数据框,如下所示:

> 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
于 2015-12-11T22:07:37.260 回答
2

为什么不试试:

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

哪个会返回:

> df[grep(pattern = "a", x = rownames(df)),]
    a b
a11 0 1

使用grep将为您提供额外的灵活性,例如,如果您想匹配只有以下内容的行

> df[grep(pattern = "^a$", x = rownames(df)),]
[1] a b
<0 rows> (or 0-length row.names)
于 2015-12-11T22:03:47.947 回答