2014-12-05 191 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的答案中的第二個建議使用相同的邏輯,但利用非運算符!,這是解決問題的另一種好方法。