我目前遇到一个问题,我有一个数据表,其中包含开始日期和结束日期以及ID。新表应具有相同的ID和一个列日期,包含第一天和最后一天之间的天数,每行一天,即
old.table
ID first.date last.date
1 2001-01-01 2001-01-03
2 2002-02-01 2002-02-04
new table
ID date
1 2001-01-01
1 2001-01-02
1 2001-01-03
2 2002-02-01
2 2002-02-02
2 2002-02-03
2 2002-02-04
我知道,那叫
seq(first.date,last.date,"day")
创建这样的序列。但是,请致电
old.table[,date := seq(first.date,last.date,"day")])
抛出异常
Error in seq.Date(first.date, last.date, "day") :
'from' must be of length 1
意思是,无法对输入进行矢量化(至少不是这样)。
有没有办法,以获得所需的解决方案?
答案 0 :(得分:4)
由于seq
只占from
和to
中的一个元素,我们可以按'id'分组(如果没有重复项),然后执行seq
setDT(old.table)[, .(date = seq(first.date, last.date, by = '1 day')), by = ID]
# ID date
#1: 1 2001-01-01
#2: 1 2001-01-02
#3: 1 2001-01-03
#4: 2 2002-02-01
#5: 2 2002-02-02
#6: 2 2002-02-03
#7: 2 2002-02-04
如果'ID'也重复,则按行序列分组
setDT(old.table)[, .(date = seq(first.date, last.date, by = '1 day')),
by = .(ID, ID2 = seq_len(nrow(old.table)))]