【问题标题】:Add ordered ID for each group by date按日期为每个组添加有序 ID
【发布时间】:2020-09-08 06:04:54
【问题描述】:

我想为数据框中的每个组添加一个有序 ID(按日期)。我可以使用 dplyr (R - add column that counts sequentially within groups but repeats for duplicates) 做到这一点:

# Example data
date <- rep(c("2016-10-06 11:56:00","2016-10-05 11:56:00","2016-10-05 11:56:00","2016-10-07 11:56:00"),2)
date <- as.POSIXct(date)
group <- c(rep("A",4), rep("B",4))    
df <- data.frame(group, date)

# dplyr - dense_rank
df2 <- df %>% group_by(group) %>% 
       mutate(m.test=dense_rank(date))

   group                date m.test
  <fctr>              <dttm>  <int>
1      A 2016-10-06 11:56:00      2
2      A 2016-10-05 11:56:00      1
3      A 2016-10-05 11:56:00      1
4      A 2016-10-07 11:56:00      3
5      B 2016-10-06 11:56:00      2
6      B 2016-10-05 11:56:00      1
7      B 2016-10-05 11:56:00      1
8      B 2016-10-07 11:56:00      3

所以我的新专栏m.testdate 对每个group 进行排名。如果我使用rleiddata.table,它似乎不起作用(05/10 排在 06/10 之后):

df3 <- setDT(df)[, m.test := rleid(date), by = group]

   group                date m.test
1:     A 2016-10-06 11:56:00      1
2:     A 2016-10-05 11:56:00      2
3:     A 2016-10-05 11:56:00      2
4:     A 2016-10-07 11:56:00      3
5:     B 2016-10-06 11:56:00      1
6:     B 2016-10-05 11:56:00      2
7:     B 2016-10-05 11:56:00      2
8:     B 2016-10-07 11:56:00      3

我的语法错了吗?

【问题讨论】:

  • dplyr 的dense_rank(...)data.table 等价于frank(..., ties.method = "dense"),afaik
  • 谢谢。我对最初提出的这个问题的答案感到困惑(stackoverflow.com/questions/37008864/…)。我认为在这种情况下 rleid 不适用于日期。
  • 你想发表答案吗。
  • 不,但你可以回答你自己的问题(或删除它)

标签: r data.table rank


【解决方案1】:

感谢@docendo discimus,使用data.table 执行此操作的正确方法是frank(..., ties.method = "dense")

df4 <- setDT(df)[, m.test := frank(date, ties.method = "dense"), by = group]

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多