我需要帮助以一种简单的方式通过分组来确定数据框中一组变量的缺失比例。例如,考虑包装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的新手,我很感激任何帮助。
答案 0 :(得分:2)
这是相当简单的sapply
和tapply
饲料。
举个简单的例子:
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]