按日期为每个组添加订购 ID
Add ordered ID for each group by date
我想为数据框中的每个组添加一个有序 ID(按日期)。我可以使用 dplyr ():
# 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.test
将每个 group
排名 date
。如果我用rleid
和data.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
我的语法有误吗?
感谢@docendo discimus,使用 data.table
执行此操作的正确方法是 frank(..., ties.method = "dense")
:
df4 <- setDT(df)[, m.test := frank(date, ties.method = "dense"), by = group]
我想为数据框中的每个组添加一个有序 ID(按日期)。我可以使用 dplyr (
# 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.test
将每个 group
排名 date
。如果我用rleid
和data.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
我的语法有误吗?
感谢@docendo discimus,使用 data.table
执行此操作的正确方法是 frank(..., ties.method = "dense")
:
df4 <- setDT(df)[, m.test := frank(date, ties.method = "dense"), by = group]