按行名称索引data.frame时出现意外行为

时间:2015-08-05 15:01:32

标签: r subset

我不经常使用索引data.frame by row name,但有时候这样做有一个优势。但是,当我试图过滤不引人注意的行

时,我注意到了意想不到的结果
  test <- data.frame(a = c("a", "b", "c"), 
                     b = c("A", "B", "C"), 
                     row.names = c(-99.5, 99.5, 99))
  test["-99", ]

你会期望它会给你

     a    b
NA <NA> <NA>

但它返回

      a b
-99.5 a A

只是具体而言

Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 3.2.1 (2015-06-18)
 system   x86_64, mingw32             
 ui       RStudio (0.99.441)          
 language (EN)                        
 collate  English_United Kingdom.1252 
 tz       Europe/London  

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

这确实是出乎意料的。

这个问题的答案在于索引时行名称的部分匹配:

mtcars["Val", ]

会给我们“Valient”排。这不适用于列:

mtcars[ ,"cy"]

为了消除这种情况,我使用了

子集
subset(test, rownames(test) == "-99")

编辑:确实记录在?"[.data.frame"

  

[和[[提取方法部分匹配行名称]。默认情况下   既不是部分匹配列名,也不是[[如果精确= FALSE   (如果精确= NA,则发出警告)。如果你想要完全匹配   行名称使用匹配,如示例中所示。

要对数据使用匹配:

test[match("-99", row.names(test)), ]