Подтвердить что ты не робот

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

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

Мои data.frame выглядят как

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

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

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

У меня возникла ошибка,

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

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

4b9b3361

Ответ 1

Данные:

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)))]

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Основной метод 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()).

Ответ 6

Другой альтернативой пакету dplyr было бы использование функции Filter

Filter(function(x) !any(is.na(x)), Itun)

с data.table было бы немного более громоздким

setDT(Itun)[,.SD,.SDcols=setdiff((1:ncol(Itun)),
                                which(colSums(is.na(Itun))>0))]