R语言 返回行名称的部分匹配

hvvq6cgz  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(162)

我遇到了以下问题

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

mccptt67

mccptt671#

奇怪,我都没意识到有部分匹配这回事。
除了直接索引到 Dataframe 之外,您还可以尝试分别识别与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
5gfr0r5j

5gfr0r5j2#

为什么不试试:

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)

相关问题