使用lapply列出R中每列中的空变量百分比

时间:2015-06-02 18:48:45

标签: r apply lapply mapply

我获得了一个大的csv,其中包含115列和1000行。列有各种各样的数据,有些是基于字符的,有些是整数等。但是,数据有很多不同类型的空变量(NA,-999,NULL等)。

我想要做的是编写一个脚本,该脚本将生成列的LIST,其中列中超过30%的数据是某种类型的NULL。

为此,我编写了一个脚本,为我提供了一列的空百分比(十进制)。 这个脚本对我来说很好。

length(which(indata$ObservationYear == "" | is.na(indata$ObservationYear) |
indata$ObservationYear == "NA" | indata$ObservationYear == "-999" |
indata$ObservationYear == "0"))/nrow(indata)

我想编写一个脚本来为所有列执行此操作。我相信我需要使用lapply函数。

我试图在这里做到这一点,但是,我似乎无法让这个脚本工作:

Null_Counter <- lapply(indata, 2, length(x),
                   length(which(indata == "" | is.na(indata) | indata == "NA" | indata == "-999" | indata == "0")))
                   names(indata(which(0.3>=Null_Counter / nrow(indata))))

我收到以下错误:

Error in match.fun(FUN) : '2' is not a function, character or symbol

Error: could not find function "indata"

理想情况下,我希望它给我的是所有列名称的向量列表,其中所有空值变量(NA,-999,0,NULL)的百分比超过30%。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我相信你想使用apply而不是lapply将一个函数应用于列表。 试试这个:

Null_Counter <- apply(indata, 2, function(x) length(which(x == "" | is.na(x) | x == "NA" | x == "-999" | x == "0"))/length(x))
Null_Name <- colnames(indata)[Null_Counter >= 0.3]

答案 1 :(得分:0)

以下是data.table中执行此操作的另一种方法:

#first, make a reproducible example:
library(data.table)
#make it so that all columns have ~30% "NA" as you define it
dt<-as.data.table(replicate(
  115,sample(c(1:100,"",NA,"NA",-999,0),size=1000,replace=T,
             prob=c(rep(.007,100),rep(.06,5)))))

现在,弄清楚哪些是麻烦的:

x<-as.matrix(dt[,lapply(.SD,function(x){
  mean(is.na(x) | x %in% c("","NA","-999","0"))})])
colnames(x)[x>.3]

这可能是一种更为简洁的方式,但它让我不知所措。

如果您尝试删除这些列,可以调整:

dt[,!colnames(x)[x>.3],with=F]