聚合具有特定共享值的行

Aggregate rows with specific shared value

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

示例数据:

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

您可以使用 group_by 来自 dplyr:

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

和上面的想法完全一样:

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 的代码仅适用于您的特定示例。

希望对你有所帮助。

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