如何基于 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))
我的数据框“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))