如何解决如何基于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())
任何帮助将不胜感激。
提前致谢。
解决方法
这是 rleid
包中的 data.table
函数的完美用例:
# example data
xx <- rep(Sys.Date(),5)
xx <- c(xx,xx + lubridate::days(1))
id <- rep(c(1:4),c(2,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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。