Удалить столбцы из фрейма данных, где некоторые значения - 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' должен быть массивом по меньшей мере двух измерений
Кто-нибудь может мне помочь?
Ответы
Ответ 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))]