R 行仅对子集数据帧中的正值求和
我有一个df,它需要被子集(通过一个列名变量)。我遇到问题,因为我需要创建两个计算:R 行仅对子集数据帧中的正值求和,r,R,我有一个df,它需要被子集(通过一个列名变量)。我遇到问题,因为我需要创建两个计算: 对变量中预定义的列求和(如果它们>0) 统计变量中预定义的列(如果它们>0) 我的实际df包含500k行和40列,但我使用以下方法将其子集: BD[, var_names] may_18 jun_18 jul_18 ago_18 sep_18 <dbl> <dbl> <dbl> <dbl> <dbl> 1 NA 6.78
BD[, var_names]
may_18 jun_18 jul_18 ago_18 sep_18
<dbl> <dbl> <dbl> <dbl> <dbl>
1 NA 6.78 NA 4.88 NA
2 42.9 262. -198. 78.5 53.2
3 24.0 21.7 28.4 25.4 14.6
4 222 242. 284. 259. 283.
5 0 0 0 0 0
6 281. 486. 500. 485. 227.
但它不太管用。
此外,我也尝试过这一点:
rowSums(BD[, var_names] > 0, na.rm = TRUE)
表的预期输出类似于
SUM COUNT
11,66 2
436,6 4
114,1 5
1290 5
0 0
1979 5
提前谢谢 在base R中,一种方法可以是:
var_names <- c("may_18", "jun_18", "jul_18", "ago_18", "sep_18")
cbind(SUM = apply(df[var_names], 1, function(x) sum(x[x > 0], na.rm = TRUE)),
COUNT = rowSums(df[var_names] > 0, na.rm = TRUE))
SUM COUNT
1 11.66 2
2 436.60 4
3 114.10 5
4 1290.00 5
5 0.00 0
6 1979.00 5
太棒了!。最后在BaseR中,我修改了cbind部分,将计算直接添加到df中。
var_names <- c("may_18", "jun_18", "jul_18", "ago_18", "sep_18")
cbind(SUM = apply(df[var_names], 1, function(x) sum(x[x > 0], na.rm = TRUE)),
COUNT = rowSums(df[var_names] > 0, na.rm = TRUE))
SUM COUNT
1 11.66 2
2 436.60 4
3 114.10 5
4 1290.00 5
5 0.00 0
6 1979.00 5
library(dplyr)
df %>%
select(var_names) %>%
transmute(SUM = rowSums(mutate_all(., ~if_else(.x < 0, NA_real_, .x)), na.rm = TRUE),
COUNT = rowSums(. > 0, na.rm = TRUE))