我正在尝试使用隐式列名使用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))
我尝试过的事情:
filter_at
的{{1}}个组件,但发现它不足以达到此目的,因为它们占用了整行,而我是每列独立过滤行。dplyr
函数中的条件。这可能是我得到的最接近但是评价总是解决了拖延总和的布尔。例如summarise
答案 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