我有一个包含许多列的数据框,获得以下摘要是很多手动工作。在样本数据集中,需要三次计算value
列的总和,仅针对每个con列为“TRUE”的观察值。
# sample dataset
df <- data.frame(
value = c(1:20),
con1 = c("TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE"),
con2 = c("FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE"),
con3 = c("FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE"))
手动过程可以这样完成:
df %>% group_by(con1) %>% summarise(value = sum(value))
在这种情况下,仅当value
列中的对应值为“TRUE”时,观察的con1
列的总和为70。
结束数据框应如下所示:
data.frame(con1 = 70, con2 = 63, con3 = 57)
答案 0 :(得分:2)
您可以使用summarise_at
汇总 con 列,并为每列将其应用为 value 列的逻辑过滤器并对其求和:
df %>%
summarise_at(vars(starts_with('con')), funs(sum(value[as.logical(.)])))
# con1 con2 con3
#1 70 63 57