在data.table

时间:2015-12-28 10:42:41

标签: r date data.table

我有一个相当简单的问题。请参阅以下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]

不幸的是,我只能将一个值传递给fromby。我有一个非常大的数据集,并希望有一个快速简单的解决方案。

1 个答案:

答案 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