r - 在多列上应用单个条件

时间:2018-04-24 18:30:14

标签: r filter dplyr conditional-statements multiple-columns

我有一个包含许多列的数据框,获得以下摘要是很多手动工作。在样本数据集中,需要三次计算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)  

1 个答案:

答案 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