rowSum只对子集数据帧中的正值求和

时间:2019-04-25 22:52:38

标签: r

我有一个df,需要将其子集化(通过列名变量)。我遇到了麻烦,因为我需要创建2个计算:

  1. 对变量中预定义的列求和,如果它们> 0

  2. 对变量中预定义的列进行计数,如果它们> 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

谢谢!

1 个答案:

答案 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))