我遇到了以下问题
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不允许这种部分匹配?
答案 0 :(得分:4)
您可以尝试识别与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
答案 1 :(得分:1)
为什么不尝试:
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)