【问题标题】:dplyr conditional summationdplyr 条件求和
【发布时间】:2018-09-24 15:07:49
【问题描述】:

我有以下数据框:

set.seed(42)
df <- data_frame(x = sample(0:100, 50, replace = T), 
                 y = sample(c(T, F), 50, replace = T))

我想创建第三列z,这将是列x 的总和,但前提是y 列中的一行中有超过3 个trues。 是否有使用dplyr 的矢量化方法?我什至不知道如何解决这个问题。

【问题讨论】:

    标签: r dplyr cumsum


    【解决方案1】:

    我们使用data.table中的rleid创建一个分组变量,如果有超过3个元素(n() &gt;3)和ifall'y中的元素,则获取'x'的sum ' 为 TRUE 或 else 返回 NA

    library(dplyr)
    library(data.table)
    df %>% 
      group_by(grp = rleid(y)) %>% 
      mutate(Sum = if(n() > 3 & all(y)) sum(x) else NA_integer_) %>%
      ungroup %>%
      select(-grp)
    

    也可以用data.table完成

    library(data.table)
    setDT(df)[,  Sum := sum(x) * NA^(!((.N > 3) & all(y))), .(grp = rleid(y))]
    

    【讨论】:

      【解决方案2】:

      问题没有指定如果没有 3 个 TRUE 值要使用什么值,所以我们将使用 0。

      library(dplyr)
      library(zoo)
      
      sum3 <- function(z) all(z[, "y"]) * sum(z[, "x"])
      df %>% mutate(sum = rollapplyr(df, 3, sum3, by.column = FALSE, fill = 0))
      

      给予:

       # A tibble: 50 x 3
             x y       sum
         <int> <lgl> <int>
       1    92 TRUE      0
       2    94 TRUE      0
       3    28 TRUE    214
       4    83 FALSE     0
       5    64 TRUE      0
       6    52 FALSE     0
       7    74 FALSE     0
       8    13 TRUE      0
       9    66 TRUE      0
      10    71 FALSE     0
      # ... with 40 more rows
      

      【讨论】:

        猜你喜欢
        • 2018-04-13
        • 2022-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2021-06-09
        相关资源
        最近更新 更多