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

kis*_*msu 10 r subset

我不经常使用索引data.frame逐行名称,但有时候这样做有一个优势.但是,当我试图过滤出令人不快的行时,我注意到了意想不到的结果

  test <- data.frame(a = c("a", "b", "c"), 
                     b = c("A", "B", "C"), 
                     row.names = c(-99.5, 99.5, 99))
  test["-99", ]
Run Code Online (Sandbox Code Playgroud)

你会期望它会给你

     a    b
NA <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

但它回来了

      a b
-99.5 a A
Run Code Online (Sandbox Code Playgroud)

只是具体而言

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  
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jer*_*ycg 6

这确实是意料之外的.

答案是在索引时部分匹配行名称:

mtcars["Val", ]
Run Code Online (Sandbox Code Playgroud)

会给我们"有意义"的排.这不适用于列:

mtcars[ ,"cy"]
Run Code Online (Sandbox Code Playgroud)

为了消除这种情况,我使用以下子集:

subset(test, rownames(test) == "-99")
Run Code Online (Sandbox Code Playgroud)

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

[和[[提取方法部分匹配行名称].默认情况下,既不是部分匹配列名,也不是[[如果精确= FALSE(并且如果精确= NA则带有警告).如果要在行名称上进行精确匹配,请使用match,如示例所示.

要对数据使用匹配:

test[match("-99", row.names(test)), ]
Run Code Online (Sandbox Code Playgroud)