【发布时间】:2017-12-29 17:12:00
【问题描述】:
我正在尝试使用 R 和 dplyr 使用隐式列名执行条件求和。所以从
> 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
但是,我想要一个不必明确说明列名(colA、colB 等)的解决方案,因为有很多列名,而且将来可能会发生变化。如果我正在做一个简单的sum 计算,dplyr 和:
df %>%
summarise_all(funs(sum))
我尝试过的事情:
-
dplyr的filter_at组件但发现不足以用于此目的,因为它们占用整行,而我正在独立过滤每列的行。 - This 回答但发现它不够用,因为它使用了明确的列名。
- 自定义
summarise函数内的条件。这可能是我得到的最接近的结果,但评估总是解析为布尔值,它会抛出求和。例如summarise_all(funs(sum(. > 1)))
【问题讨论】: