2016-11-23 11 views
0

У меня есть Р кадр данных DF нижеКак удалить строки из фрейма данных R, которые имеют NA в двух столбцах (NA в обоих столбцах НЕ один)?

a b c 

1 6 NA 
2 NA 4 
3 7 NA 
NA 8 1 
4 9 10 
NA NA 7 
5 10 8 

Я хочу удалить строку, которая имеет NA в обоих & б

Мой желаемый выход будет

a b c 

1 6 NA 
2 NA 4 
3 7 NA 
NA 8 1 
4 9 10 
5 10 8 

Я пытался что-то например, ниже

df1<-df[(is.na(df$a)==FALSE & is.na(df$b)==FALSE),] 

, но это удаляет все НС (выполняет функцию ИЛИ). Мне нужно сделать операцию И здесь.

Как это сделать?

+2

Как об этом 'которых (rowSums (DF, na.rm = T)> 0)'. –

+0

df [rowSums (is.na (df [, 1: 2])) == 2,] –

ответ

1

Мы можем использовать rowSums на логической матрице (is.na(df1)) и преобразовать ее в логический вектор (rowSums(...) < ncol(df1)) для подмножества строк.

df1[rowSums(is.na(df1)) < ncol(df1),] 

Или другой вариант Reduce с lapply

df1[!Reduce(`&`, lapply(df1, is.na)),] 
1

Другой подход

df[!apply(is.na(df),1,all),] 
# a b 
#1 1 6 
#2 2 NA 
#3 3 7 
#4 NA 8 
#5 4 9 
#7 5 10 

данных

df <- structure(list(a = c(1L, 2L, 3L, NA, 4L, NA, 5L), b = c(6L, NA, 
7L, 8L, 9L, NA, 10L)), .Names = c("a", "b"), class = "data.frame", row.names = c(NA, 
-7L)) 
0

это также будет работать:

df[apply(df, 1, function(x) sum(is.na(x)) != ncol(df)),] 

    a b 
1 1 6 
2 2 NA 
3 3 7 
4 NA 8 
5 4 9 
7 5 10 
2

Вы можете попробовать:

df1<-df[!(is.na(df$a) & is.na(df$b)), ] 
0

Моя мысль в основном то же самое с другими ответами.

Учитывая любой набор данных с определенной строкой, имеющей все НС, сумма !is.na(ROW) всегда будет равна нулю. Так что вам просто нужно вынуть этот ряд.

Таким образом, вы можете просто сделать:

df1 = df[-which(rowSums(!is.na(df))==0),] 
2

использованием rowSums

df[!rowSums(is.na(df))==2,] 

лучше один, сохранив характер [1]

df[rowSums(is.na(df))!=2,] 

выход:

a b 
1 1 6 
2 2 NA 
3 3 7 
4 NA 8 
5 4 9 
7 5 10 

могут быть обобщены с помощью ncol

df[!rowSums(is.na(df))==ncol(df),] 

[1] кредиты: alistaire

+1

Вы можете сохранить символ и просто использовать '! =' – alistaire