在dplyr

时间:2017-12-29 17:12:01

标签: r dplyr

我正在尝试使用隐式列名使用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))

我尝试过的事情:

  • filter_at的{​​{1}}个组件,但发现它不足以达到此目的,因为它们占用了整行,而我是每列独立过滤行。
  • This回答但发现它不够,因为它使用了明确的列名。
  • 自定义dplyr函数中的条件。这可能是我得到的最接近但是评价总是解决了拖延总和的布尔。例如summarise

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您也可以使用基础R中的table()

sapply