我不经常使用索引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)
有任何想法吗?
这确实是意料之外的.
答案是在索引时部分匹配行名称:
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)