我的数据看起来像这样:
df1 <- data.frame(
Z = sample(LETTERS[1:5], size = 10000, replace = T),
X1 = sample(c(1:10,NA), 10000, replace = T),
X2 = sample(c(1:25,NA), 10000, replace = T),
X3 = sample(c(1:5,NA), 10000, replace = T)
)
我可以用以下方法计算丢失的变量:
data.frame("Total Missing" = colSums(is.na(df1)))
但是,我想通过
Z
这样做。也就是说,每个Z值缺少X1-3的数量。我试过了
df1 %>% group_by(Z) %>% summarise('Total Missing' = colSums(is.na(df1)))
但它没有按我预期的那样工作。
最佳答案
您可以使用summarise_each
:
df1 %>%
group_by(Z) %>%
summarise_each(funs(sum(is.na(.))))
#Source: local data frame [5 x 4]
#
# Z X1 X2 X3
# (fctr) (int) (int) (int)
#1 A 169 77 334
#2 B 170 77 316
#3 C 159 78 348
#4 D 181 79 326
#5 E 174 69 341
请注意,您可以在
summarise_each
内部指定将功能应用到哪些列(默认是除分组列之外的所有列)或不应该将功能应用到哪些列。您可能还很感兴趣的注意到,像summarise_each
到summarise
一样,如果要对所有列应用函数而不汇总结果,则mutate_each
也可以作为mutate
的补充。强制性data.table等效项是:
library(data.table)
setDT(df1)[, lapply(.SD, function(x) sum(is.na(x))), by = Z]
# Z X1 X2 X3
#1: D 181 79 326
#2: C 159 78 348
#3: B 170 77 316
#4: A 169 77 334
#5: E 174 69 341
在基本R中,您可以使用如下的拆分/应用/合并方法:
do.call(rbind,
lapply(
split(df1, df1$Z), function(dd) {
colSums(is.na(dd[-1]))
}))
# X1 X2 X3
#A 169 77 334
#B 170 77 316
#C 159 78 348
#D 181 79 326
#E 174 69 341
或者,也可以在基数R中使用
aggregate
:aggregate(df1[-1], list(df1$Z), FUN = function(y) sum(is.na(y)))
aggregate(. ~ Z, df1, FUN = function(y) sum(is.na(y)), na.action = "na.pass") # formula interface