繁体   English   中英

列子集 dplyr 的条件行和

[英]Conditional rowwise sum of subset of columns dplyr

我的问题有点简单,但我没有找到正确的解决方案。 得到一个 dataframe 像这样:

ID   name   var1  var2  var3
1     a       1     -1   2
2     b       2     3    2
3     c       1     -1  -1

我需要从 var1 到 var3 获取var_total变量中大于零的每个数字的总和,如下所示:

ID   name   var1  var2  var3 var_total
1     a       1    -1    2      3
2     b       2     3    2      7
3     c       1    -1   -1      1

我设法得到了无条件的总和,如下所示:

 df %>% rowwise %>%  mutate(var_total = sum(c_across(starts_with('var'))))

我知道有na.rm选项,所以我想我可能可以暂时将负值转换为 NA,但我不确定这是否是正确的方法,以及是否有一种简单的方法可以取回原始数字。

谢谢!

使用c_acrossrowwise -

library(dplyr)

df %>%
  rowwise() %>%
  mutate(var_total = {
    x <- c_across(starts_with('var'))
    sum(x[x > 0])
    })

但是向量化的基础 R 选项将是 -

cols <- grep('var', names(df))
df$var_total <- rowSums(df[cols] * +(df[cols] > 0))
df
#  ID name var1 var2 var3 var_total
#1  1    a    1   -1    2         3
#2  2    b    2    3    2         7
#3  3    c    1   -1   -1         1

这是一个基本的 R 单线,

rowSums(replace(df, df < 0, 0)[-c(1, 2)])
#[1] 3 7 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM