【问题标题】:Unexpected behaviour in indexing data.frame by row name按行名索引 data.frame 中的意外行为
【发布时间】:2015-10-28 10:38:01
【问题描述】:

我不经常使用按行名索引 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", ]

你会期望它会给你

     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  

有什么想法吗?

【问题讨论】:

  • 可能在调用函数时已经使用了一些模糊匹配机制。
  • 什么意思?这里没有功能。空环境中的此错误。
  • 这是一个很好的例子,说明为什么您应该始终使用逻辑条件进行子集/索引。 TRUE 或 FALSE 比命名引用更加可靠和直观。此外,往往更容易调试。
  • 我完全同意并且我同意,但是对于这种情况,我需要保持测试 data.frame 的顺序。当您按逻辑条件索引时,排序将取决于索引向量,而不是原始表。无论如何,会想办法解决它。

标签: r subset


【解决方案1】:

这确实出乎意料。

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

mtcars["Val", ]

将为我们提供“Valient”行。这不适用于列:

mtcars[ ,"cy"]

为了消除这种情况,我会使用以下方法进行子集化:

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

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

[ 和 [[ 提取方法都部分匹配行名称。默认 既不部分匹配列名,但 [[ 如果精确 = FALSE (如果确切 = NA,则会发出警告)。如果你想精确匹配 行名称使用匹配,如示例中所示。

要对您的数据使用匹配:

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

【讨论】:

  • 我现在意识到我确实读错了问题。好答案 (+1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2017-11-29
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
相关资源
最近更新 更多