【问题标题】:How to create a sequence numerical column based on two columns in r?如何基于 r 中的两列创建序列数值列?
【发布时间】:2021-03-29 11:37:53
【问题描述】:

我的数据框“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”,我将有一列编号为 1,从波长 350 到 2300。下一个 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())

任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

  • 您应该包含至少一部分数据框的代码。类似于 dput(fsp, 10) 的输出。如果您清楚地说明所需的输出并显示示例,它也会更容易为您提供帮助。正如您所写,我不确定您是否只想对这个新列使用 1:nrow(fsp) 之类的整数序列,还是希望对每组“ID”使用 1:nrow()。
  • 好吧,输出 dput 会有点乱,因为数据结构是相同的 1950 per 1950 obs。我想要的是一个带有数字序列的新列“target_ID”,每个“ID”和“日期”都是 1:nrow()。由于每个 ID 和日期都有 1950 obs。我想要 1950 obs 的数字“1”,下一个 1950 obs 的数字 2。等等。 “ID”和“日期”必须包含在代码中,因为有时我对不同的“ID”有相同的“日期”。
  • @PKumar 这给了我一个贯穿所有数据点的数字序列。我想要的是基于日期和 ID 的数字序列。类似“开头的第一个日期和 ID 为 1,当日期或 ID 更改时变为数字 2 以此类推……”这样的命令

标签: r dplyr sequence numeric


【解决方案1】:

这是 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

您可以使用%&gt;%mutate 来解决这个问题:

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

【讨论】:

  • 感谢您的帮助。该代码有效,但对于我的数据,target_id 在数据中保持相同的数字“1”。也许列格式是正确运行代码的问题...... id 是数字吗?在我的数据框中,“日期”是双倍的,“ID”是字符。
  • 没关系,我不得不重新启动 R 并且代码运行良好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多