删除缺少值的列

时间:2011-09-07 08:30:06

标签: r

我有一个包含大量列的表格,我想删除超过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 个答案:

答案 0 :(得分:9)

这是一个单行班[{1}}

答案 1 :(得分:5)

如果您存储统计信息的结果,请执行以下操作:

tmpres<-t(stats(mm))

您可以执行以下操作:

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

最后:

mmclean<-mm[!whichcolsneedtogo]

当然这是未经测试的,因为您没有提供数据来重现您的示例。

答案 2 :(得分:4)

另一种可能的解决方案(对数据帧特别有效):

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

答案 3 :(得分:0)

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]

答案 4 :(得分:0)

m是您正在使用的矩阵。 这会创建一个矢量wntg (代表哪个需要去) 列出NA值大于500的总和的列

可以轻松修改此比较的条件以满足您的需求

然后创建一个新的矩阵,我称之为mr(代表m简化),你已经删除了列 由向量定义,wntg

在这个简单的例子中,我已经完成了你想要排除超过2个NA的列的情况

wntg&LT;哪位(colSums(is.na(米))→2)

先生&LT; -m [, - C(wntg)]

> 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