【问题标题】:r - apply single condition on multiple columnsr - 在多列上应用单个条件
【发布时间】:2018-10-05 02:57:33
【问题描述】:

我有一个包含许多列的数据框,要获得以下摘要需要大量手动工作。在示例数据集中,仅对于每个 con 列分别为“TRUE”的观察,需要计算 value 列的总和三次。

# 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))

在这种情况下,仅当 con1 列中的对应值为“TRUE”时,观察的 value 列的总和为 70。

结束的数据框应该是这样的:

data.frame(con1 = 70, con2 = 63, con3 = 57)  

【问题讨论】:

  • 你应该使用 R 的内置 TRUE/FALSE 而不是用“TRUE”/“FALSE”重新发明那个轮子。

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


【解决方案1】:

您可以使用summarise_at 来汇总con 列,并将其作为逻辑过滤器应用到value 列并汇总:

df %>% 
    summarise_at(vars(starts_with('con')), funs(sum(value[as.logical(.)])))

#  con1 con2 con3
#1   70   63   57

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2015-12-28
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多