Удалите столбцы из dataframe, где некоторые из значений NA

у меня есть фрейм данных, где некоторые из значений NA. Я хотел бы удалить эти столбцы.

мои данные.рамка выглядит так

    v1   v2 
1    1   NA 
2    1    1 
3    2    2 
4    1    1 
5    2    2 
6    1   NA

Я попытался оценить среднее значение col и выбрать значение столбца !=Н. Я пробовал это утверждение, оно не работает.

data=subset(Itun, select=c(is.na(colMeans(Itun))))

Я получил ошибку,

ошибка: "x" должен быть массивом по крайней мере двух измерений

кто-нибудь может мне помочь?

5 ответов


данные:

Itun <- data.frame(v1 = c(1,1,2,1,2,1), v2 = c(NA, 1, 2, 1, 2, NA)) 

это удалит все столбцы, содержащие по крайней мере один NA:

Itun[ , colSums(is.na(Itun)) == 0]

альтернативный способ-использовать apply:

Itun[ , apply(Itun, 2, function(x) !any(is.na(x)))]

вот удобный способ сделать с помощью dplyr функции select_if(). Объединить не (!),any() и is.na(), что эквивалентно выбору всех столбцов, которые не содержат значений NA.

library(dplyr)
Itun %>%
    select_if(~ !any(is.na(.))

вы можете использовать транспонировать дважды:

newdf <- t(na.omit(t(df)))

data[,!apply(is.na(data), 2, any)]

базовый метод R, связанный с apply ответы

Itun[!unlist(vapply(Itun, anyNA, logical(1)))]
  v1
1  1
2  1
3  2
4  1
5  2
6  1

здесь vapply используется, поскольку мы работаем над списком, и,apply, он не принуждает объект к матрице. Кроме того, поскольку мы знаем, что выход будет логическим вектором длины 1, мы можем передать это в vapply и потенциально получить небольшое повышение скорости. По той же причине, я использовал anyNA вместо any(is.na()).