【问题标题】:R returning partial matching of row namesR返回行名的部分匹配
【发布时间】:2016-03-17 22:31:46
【问题描述】:

我遇到了以下问题

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

【问题讨论】:

标签: r dataframe matching rowname


【解决方案1】:

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

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

> 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2016-05-15
      • 2015-05-18
      • 2010-09-18
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多