如何基于 r 中的两列创建序列数字列?

How to create a sequence numerical column based on two columns in r?

我的数据框“fsp”为 1702551 obs 和 3 个变量。它看起来像这样:

tibble [1,702,551 x 3] 
 $ date       : Date[1:1702551], format: "2011-04-12" "2011-04-12" "2011-04-12" ...
 $ wavelength : num [1:1702551] 350 351 352 353 354 355 356 357 358 359 ...
 $ ID         : chr [1:1702551] "c01" "c01" "c01" "c01" ...

数据的快速解释:根据每个“日期”和“ID”,我在整个波长间隔(350 到 2300nm)中都有一个光谱数据(未显示)。 我想创建一个新列“target_ID”,其中包含一系列重复数字,每次日期或 ID 更改时,这些数字都会增加到下一个连续数字。 例如,对于第一个 ID“c01”和日期“2011-04-12”,我将有一列从波长 350 到 2300 的数字为 1。下一个 ID 的数字为 2,依此类推(沿着数据框“日期”也发生变化)

我想要实现的示例(查看“target_ID”):

|date      |wavelength|ID  |target_ID|
|:---------|:---------|:---|:--------|   
|2011-04-12|350       |c01 |1        |
|2011-04-12|351       |c01 |1        |
|2011-04-12|352       |c01 |1        |
|2011-04-12|353       |c01 |1        |
|...…………………|...……………….|....|...…………….|        
|2011-04-12|350       |c03 |2        |
|2011-04-12|351       |c03 |2        |
|...……………..|...……………….|....|...………………|
|2011-04-13|350       |c01 |3        |
|2011-04-13|351       |c01 |3       |

这是我已经尝试过但没有成功的代码:

fsp<-fsp %>%
group_by(date, ID) %>%
mutate(target_ID, count=n())

非常感谢任何帮助。

提前致谢。

这是 data.table 包中 rleid 函数的完美用例:

# example data
xx <- rep(Sys.Date(), 5)
xx <- c(xx, xx + lubridate::days(1))
id <- rep(c(1:4), c(2,3,3,2))
dat <- data.frame(date = xx, id = id)

#          date id
# 1  2021-03-29  1
# 2  2021-03-29  1
# 3  2021-03-29  2
# 4  2021-03-29  2
# 5  2021-03-29  2
# 6  2021-03-30  3
# 7  2021-03-30  3
# 8  2021-03-30  3
# 9  2021-03-30  4
# 10 2021-03-30  4

library(data.table)
dat_dt <- as.data.table(dat)
dat_dt[,target_id := rleid(date, id)]

 #          date id target_id
 # 1: 2021-03-29  1         1
 # 2: 2021-03-29  1         1
 # 3: 2021-03-29  2         2
 # 4: 2021-03-29  2         2
 # 5: 2021-03-29  2         2
 # 6: 2021-03-30  3         3
 # 7: 2021-03-30  3         3
 # 8: 2021-03-30  3         3
 # 9: 2021-03-30  4         4
 #10: 2021-03-30  4         4

下面是如何使用 %>%mutate 来解决它:

library(tidyverse)
dat %>%
    mutate(target_id = data.table::rleid(date, id))