“mydata”中有四个变量,我需要删除在x1或x2中有NA的行(但不包括其他变量)。所以
我有什么
mydata <- data.frame(y=c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4), x1=c(1,NA,1,2,4,5,1, NA ,2,5,2,6,2,6,NA,2,6,NA), x2=c(1,NA,1,NA,1,1,8,2,2,2,4,1,NA,1,4,2,7,NA), x3=c(1,4,1,NA,1,1,8,2,2,NA,4,1,1,1,NA,2,7,2))
我需要什么
y x1 x2 x3
1 1 1 1 1
3 1 1 1 1
5 1 4 1 1
6 2 5 1 1
7 2 1 8 8
9 2 2 2 2
10 3 5 2 NA
11 3 2 4 4
12 3 6 1 1
14 4 6 1 1
16 4 2 2 2
17 4 6 7 7
答案 0 :(得分:2)
你可以尝试
mydata[!rowSums(is.na(mydata[,c('x1', 'x2')])),]
# y x1 x2 x3
#1 1 1 1 1
#3 1 1 1 1
#5 1 4 1 1
#6 2 5 1 1
#7 2 1 8 8
#9 2 2 2 2
#10 3 5 2 NA
#11 3 2 4 4
#12 3 6 1 1
#14 4 6 1 1
#16 4 2 2 2
#17 4 6 7 7
或者
mydata[!with(mydata, is.na(x1)|is.na(x2)),]
答案 1 :(得分:1)
另一种方式可能是
mydata[is.na(mydata$x1)==FALSE & is.na(mydata$x2) == FALSE, ]
# y x1 x2 x3
#1 1 1 1 1
#3 1 1 1 1
#5 1 4 1 1
#6 2 5 1 1
#7 2 1 8 8
#9 2 2 2 2
#10 3 5 2 NA
#11 3 2 4 4
#12 3 6 1 1
#14 4 6 1 1
#16 4 2 2 2
#17 4 6 7 7
幕后:is.na
只检查逻辑状态,例如
is.na(mydata$x1)
#[1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
#[12] FALSE FALSE FALSE TRUE FALSE FALSE TRUE
is.na(mydata$x2)
#[1] FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[12] FALSE TRUE FALSE FALSE FALSE FALSE TRUE
所以把它们放在一起
is.na(mydata$x1) == FALSE & is.na(mydata$x2) == FALSE
#[1] TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
#[12] TRUE FALSE TRUE FALSE TRUE TRUE FALSE
然后[ *, ]
将保留is.na(mydata$x1) == FALSE & is.na(mydata$x2) == FALSE
为TRUE
的12行。 akrun的答案中的第二个建议使用了相同的逻辑,但利用了非运算符!
,这是解决问题的另一种好方法。