Удаление столбцов с пропущенными значениями - PullRequest
6 голосов
/ 07 сентября 2011

У меня есть таблица с большим количеством столбцов, и я хочу удалить столбцы, содержащие более 500 пропущенных значений.

Я уже знаю количество пропущенных значений в столбце с помощью:

library(fields)
t(stats(mm))

Я получил:

  N     mean  Std.Dev.    min       Q1  median       Q3 max missing values
V1 1600 8.67  …                                               400

Некоторые столбцы имеют NA для всех характеристик:

      N     mean  Std.Dev.    min       Q1  median       Q3 max missing values
 V50  NA    NA      NA         NA        NA                   NA

Я также хочу удалить столбцы такого типа.

Ответы [ 5 ]

9 голосов
/ 07 сентября 2011

Вот один лайнер, чтобы сделать это mm[colSums(is.na(mm)) > 500]

5 голосов
/ 07 сентября 2011

Если вы сохраняете результаты вызова статистики следующим образом:

tmpres<-t(stats(mm))

Вы можете сделать что-то вроде:

whichcolsneedtogo<-apply(tmpres, 1, function(currow){all(is.na(currow)) || (currow["missing values"] > 500)})

Наконец:

mmclean<-mm[!whichcolsneedtogo]

Конечно, это не проверено, поскольку вы не предоставили данные для воспроизведения своего примера.

4 голосов
/ 29 января 2014

Другое потенциальное решение (особенно хорошо работает с кадрами данных):

data[,!sapply(data,function(x) any(is.na(x)))]

0 голосов
/ 05 августа 2014

m - это матрица, с которой вы работаете.это создает вектор wntg (обозначает, что нужно идти), в котором перечислены столбцы, у которых общее количество значений NA больше 500

Условия этого сравнения могут быть легко изменены в соответствии с вашими потребностями

Затем создайте новую матрицу, которую я называю mr (сокращенно m), где вы удалили столбцы, определенные вектором, wntg

В этом простом примере я сделал случай, когда вы хотите исключитьстолбцы с более чем 2 NA

wntg <-which (colSums (is.na (m))> 2)

mr <-m ​​[, - c (wntg)] </p>

> m<-matrix(c(1,2,3,4,NA,NA,7,8,9,NA,NA,NA), nrow=4, ncol =3)
> m
     [,1] [,2] [,3]
[1,]    1   NA    9
[2,]    2   NA   NA
[3,]    3    7   NA
[4,]    4    8   NA
> wntg<-which(colSums(is.na(m))>2)
> wntg
[1] 3
> mr<-m[,-c(wntg)]
> mr
     [,1] [,2]
[1,]    1   NA
[2,]    2   NA
[3,]    3    7
[4,]    4    8
0 голосов
/ 07 сентября 2011
rem = NULL
for(col.nr in 1:dim(data)[2]){
    if(sum(is.na(data[, col.nr]) > 500 | all(is.na(data[,col.nr])))){
        rem = c(rem, col.nr)
    }
}
data[, -rem]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...