R 行仅对子集数据帧中的正值求和

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

我有一个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   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))