我有一个相当简单的问题。请参阅以下data.table(dt):
library(data.table)
dt = data.table(id = c(rep("1",5), rep("2",10)))
dt$date <- as.Date("2000-01-01")
dt[, Index := seq_len(.N)-1, by = c("id")]
dt
id date Index
1: 1 2000-01-01 0
2: 1 2000-01-01 1
3: 1 2000-01-01 2
4: 1 2000-01-01 3
5: 1 2000-01-01 4
6: 2 2000-01-01 0
7: 2 2000-01-01 1
8: 2 2000-01-01 2
9: 2 2000-01-01 3
10: 2 2000-01-01 4
11: 2 2000-01-01 5
12: 2 2000-01-01 6
13: 2 2000-01-01 7
14: 2 2000-01-01 8
15: 2 2000-01-01 9
由此我想创建一个额外的列(让我们称之为date2),其中Index
中的每个值代表未来的相关月份。
即。当index为0(第一行和第六行)date2 = date时。但是,当index = 2时,date2 =(date + 2 months)= 2000-03-01,依此类推。
试过这个功能:
dt$date2 <- seq(dt$date, by = paste(dt$Index ,"months"), length = 2)[2]
不幸的是,我只能将一个值传递给from
和by
。我有一个非常大的数据集,并希望有一个快速简单的解决方案。
答案 0 :(得分:2)
您可以使用 lubridate 包和MONTH功能:
library(lubridate)
# First copye the date column
dt$date2 <- dt$date
# Then apply MONTH function
month(dt$date2) <- month(dt$date2) + dt$Index
结果是
id date Index date2
1: 1 2000-01-01 0 2000-01-01
2: 1 2000-01-01 1 2000-02-01
3: 1 2000-01-01 2 2000-03-01
4: 1 2000-01-01 3 2000-04-01
5: 1 2000-01-01 4 2000-05-01
6: 2 2000-01-01 0 2000-01-01
7: 2 2000-01-01 1 2000-02-01
8: 2 2000-01-01 2 2000-03-01
9: 2 2000-01-01 3 2000-04-01
10: 2 2000-01-01 4 2000-05-01
11: 2 2000-01-01 5 2000-06-01
12: 2 2000-01-01 6 2000-07-01
13: 2 2000-01-01 7 2000-08-01
14: 2 2000-01-01 8 2000-09-01
15: 2 2000-01-01 9 2000-10-01