【问题标题】:Aggregate rows with specific shared value聚合具有特定共享值的行
【发布时间】:2020-01-14 11:50:44
【问题描述】:

我想按如下方式汇总我的数据:

  • 仅聚合状态 = 0 的连续行
  • 保持年龄和积分

示例数据:

da <- data.frame(userid = c(1,1,1,1,2,2,2,2), status = c(0,0,0,1,1,1,0,0), age = c(10,10,10,11,15,16,16,16), points = c(2,2,2,6,3,5,5,5))

da
  userid status age points
1      1      0  10      2
2      1      0  10      2
3      1      0  10      2
4      1      1  11      6
5      2      1  15      3
6      2      1  16      5
7      2      0  16      5
8      2      0  16      5

我想要:


da2
  userid status age points
1      1      0  10      6
2      1      1  11      6
3      2      1  15      3
4      2      1  16      5
5      2      0  16     10

【问题讨论】:

    标签: r dplyr aggregate transform summarization


    【解决方案1】:
    da %>%
        mutate(grp = with(rle(status),
                          rep(seq_along(values), lengths)) + cumsum(status != 0)) %>%
        group_by_at(vars(-points)) %>%
        summarise(points = sum(points)) %>%
        ungroup() %>%
        select(-grp)
    ## A tibble: 5 x 4
    #  userid status   age points
    #   <dbl>  <dbl> <dbl>  <dbl>
    #1      1      0    10      6
    #2      1      1    11      6
    #3      2      0    16     10
    #4      2      1    15      3
    #5      2      1    16      5
    

    【讨论】:

      【解决方案2】:

      您可以从dplyr 使用group_by

      da %>% group_by(da$userid, cumsum(da$status), da$status) 
         %>% summarise(age=max(age), points=sum(points))
      

      输出:

        `da$userid` `cumsum(da$status)` `da$status`   age points
              <dbl>               <dbl>       <dbl> <dbl>  <dbl>
      1           1                   0           0    10      6
      2           1                   1           1    11      6
      3           2                   2           1    15      3
      4           2                   3           0    16     10
      5           2                   3           1    16      5
      

      【讨论】:

        【解决方案3】:

        和上面的思路完全一样:

        library(dplyr)
        
        data1 <- data %>% group_by(userid, age, status) %>%
          filter(status == 0) %>%
          summarise(points = sum(points))
        
        data2 <- data %>%
          group_by(userid, age, status) %>%
          filter(status != 0) %>%
          summarise(points = sum(points))
        
        data <- rbind(data1,
                      data2)
        

        我们需要更加小心你的status等于0。我认为Quang Hoang的代码只适用于你的具体例子。

        我希望它会有所帮助。

        【讨论】:

          猜你喜欢
          • 2018-05-09
          • 1970-01-01
          • 1970-01-01
          • 2018-12-21
          • 2017-02-16
          • 1970-01-01
          • 2017-03-13
          • 2018-02-09
          • 2019-02-18
          相关资源
          最近更新 更多