我有一个df,需要将其子集化(通过列名变量)。我遇到了麻烦,因为我需要创建2个计算:
对变量中预定义的列求和,如果它们> 0
对变量中预定义的列进行计数,如果它们> 0
我的实际df包含50万行和40列,但是我使用以下方法将其子集化:
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][which(var_names > 0)], na.rm = TRUE)
但是效果不佳。 另外,我已经尝试过此操作:
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
谢谢!
答案 0 :(得分:1)
在基数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
或使用dplyr
:
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))