在R数据表中按ID顺序为每个记录创建日期
我有一个带有ID和起始日期的数据表,每个唯一ID代表一行。我必须使用变量“COUNT”(本质上是起始日期和结束日期之间的间隔,以月为单位),并按顺序将起始日期复制到日期字段中,如图所示。我尝试的代码只取“COUNT”(在本例中为3)的第一个值,并依次复制ORIG_DATE。不同ID的计数不同。如何对每个唯一ID使用相应的计数,并将原始日期复制到另一个名为DATE的列中 测试数据在R数据表中按ID顺序为每个记录创建日期,r,R,我有一个带有ID和起始日期的数据表,每个唯一ID代表一行。我必须使用变量“COUNT”(本质上是起始日期和结束日期之间的间隔,以月为单位),并按顺序将起始日期复制到日期字段中,如图所示。我尝试的代码只取“COUNT”(在本例中为3)的第一个值,并依次复制ORIG_DATE。不同ID的计数不同。如何对每个唯一ID使用相应的计数,并将原始日期复制到另一个名为DATE的列中 测试数据 ID COUNT SCORE VALUE ORIG_DATE CLOSE_DATE 10748
ID COUNT SCORE VALUE ORIG_DATE CLOSE_DATE
10748 3 750 450231 2015-03-01 2015-06-01
10845 4 680 590231 2015-01-01 2015-05-01
21758 7 760 650839 2014-11-01 2015-06-01
test.panel <- test.data[rep(sequence(nrow(test.data)),COUNT)]
test.panel$DATE <- ymd(test.panel$ORIG_DATE)+ months(1:test.panel$COUNT)
使用
data.table
执行此操作实际上很简单。重新创建示例数据:
test.data <- read.table( text = "
ID COUNT SCORE VALUE ORIG_DATE CLOSE_DATE
10748 3 750 450231 2015-03-01 2015-06-01
10845 4 680 590231 2015-01-01 2015-05-01
21758 7 760 650839 2014-11-01 2015-06-01",
header = TRUE,
stringsAsFactors = FALSE,
colClasses = c("integer", "integer", "integer","integer", "Date", "Date") )
str(df)
这是可行的……因此,如果我必须倒写日期,我所需要的就是调整seq()中的=和to=选项,例如seq(2015-03-012013-05-01,by=“month”)……谢谢卡洛斯
test.data <- read.table( text = "
ID COUNT SCORE VALUE ORIG_DATE CLOSE_DATE
10748 3 750 450231 2015-03-01 2015-06-01
10845 4 680 590231 2015-01-01 2015-05-01
21758 7 760 650839 2014-11-01 2015-06-01",
header = TRUE,
stringsAsFactors = FALSE,
colClasses = c("integer", "integer", "integer","integer", "Date", "Date") )
str(df)
library(data.table)
test.data <- data.table(test.data)
test.data[ , list(CLOSE_DATE = seq(ORIG_DATE, CLOSE_DATE, by = "month")),
by = c("ID", "COUNT", "SCORE", "VALUE", "ORIG_DATE")]
ID COUNT SCORE VALUE ORIG_DATE CLOSE_DATE
1: 10748 3 750 450231 2015-03-01 2015-03-01
2: 10748 3 750 450231 2015-03-01 2015-04-01
3: 10748 3 750 450231 2015-03-01 2015-05-01
4: 10748 3 750 450231 2015-03-01 2015-06-01
5: 10845 4 680 590231 2015-01-01 2015-01-01
6: 10845 4 680 590231 2015-01-01 2015-02-01
7: 10845 4 680 590231 2015-01-01 2015-03-01
8: 10845 4 680 590231 2015-01-01 2015-04-01
9: 10845 4 680 590231 2015-01-01 2015-05-01
10: 21758 7 760 650839 2014-11-01 2014-11-01
11: 21758 7 760 650839 2014-11-01 2014-12-01
12: 21758 7 760 650839 2014-11-01 2015-01-01
13: 21758 7 760 650839 2014-11-01 2015-02-01
14: 21758 7 760 650839 2014-11-01 2015-03-01
15: 21758 7 760 650839 2014-11-01 2015-04-01
16: 21758 7 760 650839 2014-11-01 2015-05-01
17: 21758 7 760 650839 2014-11-01 2015-06-01