我想在因子水平上对数据框进行子集化,但是当存在NA
时很难这样做。这是两个比较数据帧,一个在因子列中没有NA
,一个在NA
中:
df1 <- data.frame(v = c("ABC", "def", "ABC", "ghi"),
f = c(4.11, 3.22, NA, 7.44))
df2 <- data.frame(v = c(NA, "ABC", "def", "ABC", "ghi"),
f = c(2.33, 4.11, 3.22, NA, 7.44))
在df1
中,在因子水平上进行子设置非常有效。例如:
df1[!df1$v == "ABC",]
v f
2 def 3.22
4 ghi 7.44
相反,df2
中的子集充满了问题:
df2[!df2$v == "ABC",]
v f
NA <NA> NA
3 def 3.22
5 ghi 7.44
问题是双重的:(i)包含<NA>
中带有df2$v
的行,但不应包含;(ii)紧随其后的值(即df2$f
下同一行的值)是NA
,而该值应为2.33
。
我如何清晰,正确地将df2
子集化,结果是这样的:
v f
3 def 3.22
5 ghi 7.44
您可以使用下面的代码行
df2[!(df2$v == "ABC") & !is.na(df2$v), ]
# v f
# 3 def 3.22
# 5 ghi 7.44
或者还有这行,我更喜欢,因为我不必键入几个额外的括号
df2[df2$v != "ABC" & !is.na(df2$v), ]
# v f
# 3 def 3.22
# 5 ghi 7.44