【问题标题】:How to handle variation of min_rank in dplyr如何处理 dplyr 中 min_rank 的变化
【发布时间】:2018-10-16 22:32:56
【问题描述】:

我有以下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...

【问题讨论】:

    标签: r dplyr rank


    【解决方案1】:

    这是带有rleaggregatebase R 版本

    rl <-  rle(dat$strength)
    aggregate(days ~., transform(dat, Group = rep(seq_along(rl$values), 
                  rl$lengths))[-5], FUN = sum)[-4]
    #   id name strength days
    #1  1    a       10   60
    #2  1    a        5   30
    #3  1    a       10   20
    #4  2    b       10   15
    

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 1970-01-01
        • 2017-01-22
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 2022-07-18
        相关资源
        最近更新 更多