2014-12-05 4 views
0

В «mydata» есть четыре переменные, и мне нужно удалить строки с NA в x1 OR x2 (но не в других переменных). ТакУдалить строки на основе значений столбцов

То, что я

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

Спасибо, что работает! – user9292

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) == FALSE - TRUE. Второе предложение в ответе akrun использует ту же логику, но использует не оператор !, что является еще одним хорошим способом подхода к проблеме.

Смежные вопросы