代码之家  ›  专栏  ›  技术社区  ›  Omry Atia

dplyr条件求和

  •  1
  • Omry Atia  · 技术社区  · 6 年前

    我有以下数据框:

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

    我想创建第三列 z x true 在列的行中 y . 有没有一个矢量化的方法来处理它 dplyr ? 我都不知道该怎么做。

    2 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    我们创建一个分组变量 rleid data.table 去拿那个 sum 如果有3个以上的元素( n() >3 if all “y”中的元素是真还是假 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)
    

    也可以通过 数据表

    library(data.table)
    setDT(df)[,  Sum := sum(x) * NA^(!((.N > 3) & all(y))), .(grp = rleid(y))]
    
        2
  •  1
  •   G. Grothendieck    6 年前

    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