通过分组确定数据框中一组变量的缺失比例

时间:2014-01-31 00:21:07

标签: r dataframe apply

我需要帮助以一种简单的方式通过分组来确定数据框中一组变量的缺失比例。例如,考虑包装mlbench中的大豆数据。

data(Soybean, package="mlbench")

我想为大豆$ Class的每个值计算每个变量(第2列到第36列)的比例缺失

理想情况下,输出看起来如下(数字不是真实的):

Class                   date    plant.stand       precip    ...
2-4-d-injury             0.0            5.1         19.4
alternarialeaf-spot     12.5            2.3          1.2
anthracnose              1.4            0.0         11.2
bacterial-blight         0.3            0.0          0.5  
...  

我尝试了以下内容:

myf <- function(df) {
  apply(df, 2, function(x) sum(is.na(x)) / nrow(df) * 100)
}   

by(Soybean, Soybean$Class, function(y) myf(y))

但是(i)我不想除以数据帧的总行数,例如nrow(df)不正确; (ii)产出难以消化。

这似乎是一件简单的事情,我担心我会遗漏一些明显的东西。我是R的新手,我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

这是相当简单的sapplytapply饲料。

举个简单的例子:

dat <- data.frame(
 Class=rep(letters[1:3],each=2),
 var1=c(1,2,3,NA,4,NA),
 var2=c(NA,NA,1,2,NA,3)
)

#  Class var1 var2
#1     a    1   NA
#2     a    2   NA
#3     b    3    1
#4     b   NA    2
#5     c    4   NA
#6     c   NA    3

然后试试这个:

sapply(
 dat[-1],
 function(x) {
  tapply(x,dat$Class,FUN=function(y) sum(is.na(y))/length(y) * 100 )
 }
)

结果:

#  var1 var2
#a    0  100
#b   50    0
#c   50   50

答案 1 :(得分:0)

这应该有效:

library(dplyr)
pmiss <- function(x) 100 * sum(is.na(x)) / length(x)

Soybean %.%
  group_by(Class) %.%
  summarise( 
    date = pmiss(date),
    plant.stand = pmiss(plant.stand)
  )

使用data.table可以将pmiss函数应用于所有列

library(data.table)
DT <- data.table(Soybean)
DT[, lapply(.SD, pmiss), by = Class]