子集Rdataframe导致神秘的NA行

我一直在遇到我认为是一个错误。 这不是什么大问题,但是我很好奇,如果有人看到这个。 不幸的是,我的数据是保密的,所以我不得不做一个例子,这不会是非常有帮助的。

在对数据进行子集化时,偶尔会得到不在我原始数据框中的神秘NA行。 连rownames都是NA。 例如:

example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z")) example var1 var2 1 AX 2 BY 3 AZ 

然后我运行:

 example[example$var1=="A",] var1 var2 1 AX 3 AZ NA<NA> <NA> 

当然,上面的例子实际上并没有给你这个神秘的NA行, 我在这里添加它来说明我的数据有问题。

也许这与我正在使用Google的read.xlsx包导入我的原始数据集,然后在子集化之前执行wide到long 的整形有关 。

谢谢

将条件包装在“哪个”中,例如

df [其中(df $ number1 <df $ number2),]

我看到OP已经回答了这个问题,但是由于他的评论深深地埋在了评论部分,所以我试图解决这个问题(至less在我的数据方面是一样的)。

首先,一些样本数据:

 > df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA)) > df name number1 number2 1 A 1 10 2 B 2 9 3 C 3 8 4 D 4 7 5 E 5 6 6 F 6 5 7 G 7 4 8 H 8 3 9 I 9 NA 10 J 10 NA 

现在来一个简单的filter:

 > df[df$number1 < df$number2, ] name number1 number2 1 A 1 10 2 B 2 9 3 C 3 8 4 D 4 7 5 E 5 6 NA <NA> NA NA NA.1 <NA> NA NA 

这里的问题是,第三列中存在的NA s导致R将整行重写为NA 。 尽pipe如此,数据框架的维度仍然存在。 这是我的修复,它需要知道哪个列包含NA s:

 > df[df$number1 < df$number2 & !is.na(df$number2), ] name number1 number2 1 A 1 10 2 B 2 9 3 C 3 8 4 D 4 7 5 E 5 6 

当使用类似于您发布的代码时,我遇到同样的问题。 使用函数subset()

 subset(example,example$var1=="A") 

NA行被排除。

使用dplyr:

 library(dplyr) filter(df, number1 < number2) 

另一个原因可能是你的条件错了,比如检查一个因子列是否等于一个不在其级别的值。 困扰了我一会儿。

  > example <- data.frame("var1"=c("A", NA, "A"), "var2"=c("X", "Y", "Z")) > example var1 var2 1 AX 2 <NA> Y 3 AZ > example[example$var1=="A",] var1 var2 1 AX NA <NA> <NA> 3 AZ 

也许这一定是你期待的结果…尝试这种尝试使用条件之前,以避免NA的条件

  example[which(example$var1=="A"),] var1 var2 1 AX 3 AZ