如何处理dplyr

时间:2018-05-07 07:07:09

标签: r dplyr rank

我有以下data.frame

df

id  name  strength days date
1   a     10       20   10
1   a     10       30   11
1   a     10       10   12
1   a     5        20   14
1   a     5        10   15
1   a     10       20   16
2   b     10       15   09...

我需要找到每组id连续使用名称和力量组合的天数总和。例如。预期结果

id  name  strength sumOfDays
1   a     10       60
1   a     5        30
1   a     10       20

我正在尝试min_rank使用相同的内容:

y <- df %>%
  group_by(id, name) %>%
  mutate(group = min_rank(strength ))

这给了我一个不需要的分组(逻辑正确),因为它将所有a-10组合在一起,但不考虑日期的排序:

df
id  name  strength group
1   a     10       3
1   a     10       3
1   a     10       3
1   a     5        1
1   a     5        1
1   a     10       3
2   b     10       1...

2 个答案:

答案 0 :(得分:3)

我们可以使用rleid中的data.table函数创建用于分组的列。

library(dplyr)
library(data.table)

dat2 <- dat %>%
  group_by(id, name, strength, Group = rleid(strength)) %>%
  summarise(sumOfDays = sum(days)) %>%
  ungroup() %>%
  arrange(id, Group) %>%
  select(-Group)
dat2
# # A tibble: 4 x 4
#      id name  strength sumOfDays
#   <int> <chr>    <int>     <int>
# 1     1 a           10        60
# 2     1 a            5        30
# 3     1 a           10        20
# 4     2 b           10        15

数据

dat <- read.table(text = "id  name  strength days date
1   a     10       20   10
                  1   a     10       30   11
                  1   a     10       10   12
                  1   a     5        20   14
                  1   a     5        10   15
                  1   a     10       20   16
                  2   b     10       15   09",
                  header = TRUE, stringsAsFactors = FALSE)

答案 1 :(得分:1)

以下是包含 "h_ello", "how're", "@list" base R

rle版本
aggregate