2014-12-05 150 views
0

“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 

回答

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)),] 
+0

Thanks-it works! – user9292 2014-12-05 15:04:06

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 

然后[ *, ]是要保持12行is.na(mydata$x1) == FALSE & is.na(mydata$x2) == FALSETRUE。 akrun的答案中的第二个建议使用相同的逻辑,但利用非运算符!,这是解决问题的另一种好方法。