【问题标题】:Summarize with conditions and implicit column names in dplyr用 dplyr 中的条件和隐式列名进行汇总
【发布时间】:2017-12-29 17:12:00
【问题描述】:

我正在尝试使用 Rdplyr 使用隐式列名执行条件求和。所以从

开始
> df <- data.frame(colA=c(1,2,1,1),
+                  colB=c(0,0,3,1),
+                  colC=c(0,1,2,3),
+                  colD=c(2,2,2,2))
> df
  colA colB colC colD
1    1    0    0    2
2    2    0    1    2
3    1    3    2    2
4    1    1    3    2

我正在尝试应用伪代码:

foreach column c
    if(row.val > 1)
        calc += (row.val - 1)

我可以使用一些简单的基础R 子集以相当简单的方式完成此操作:

> df.ans <- data.frame(calcA = sum(df$colA[df$colA > 1] - 1),
+                      calcB = sum(df$colB[df$colB > 1] - 1),
+                      calcC = sum(df$colC[df$colC > 1] - 1),
+                      calcD = sum(df$colD[df$colD > 1] - 1))
> df.ans
  calcA calcB calcC calcD
1     1     2     3     4

但是,我想要一个不必明确说明列名(colAcolB 等)的解决方案,因为有很多列名,而且将来可能会发生变化。如果我正在做一个简单的sum 计算,dplyr 和:

df %>% 
summarise_all(funs(sum))

我尝试过的事情:

  • dplyrfilter_at 组件但发现不足以用于此目的,因为它们占用整行,而我正在独立过滤每列的行。
  • This 回答但发现它不够用,因为它使用了明确的列名。
  • 自定义summarise 函数内的条件。这可能是我得到的最接近的结果,但评估总是解析为布尔值,它会抛出求和。例如summarise_all(funs(sum(. &gt; 1)))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以很容易地将硬编码示例转换为summarize_all,即将df$col.. 替换为.

    df %>% summarise_all(~ sum(.[. > 1] - 1))
    
    #  colA colB colC colD
    #1    1    2    3    4
    

    或者使用funs 语法:

    df %>% summarise_all(funs(sum(.[. > 1] - 1)))
    
    #  colA colB colC colD
    #1    1    2    3    4
    

    【讨论】:

    • 您能否详细说明~ 的目的/需求。我尝试了这个确切的解决方案(减去~)并花费大量时间研究错误“无法创建对不可调用对象的调用”但无济于事。 summarize_all 文档也没有使用 ~ 的示例。
    • ~ 是用于创建函数的 purrr/tidyverse 语法,其用途与 funs 相同,即 df %&gt;% summarise_all(funs(sum(.[. &gt; 1] - 1))) 。这两种语法都应该在0.7.4(我当前的dplyr版本)中工作,如果你遇到错误,你可以切换到funs语法或升级dplyr看看是否有帮助。
    【解决方案2】:

    您也可以使用基础 R 中的sapply

    sapply(df,function(x)sum(x[x>1]-1))
    colA colB colC colD 
       1    2    3    4 
    

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 2016-12-30
      • 2017-12-30
      • 2018-10-06
      • 2016-02-07
      • 2018-11-05
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多