我目前有一个问题,我有一个包含开始和结束日期以及 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
Run Code Online (Sandbox Code Playgroud)
我知道,那个呼唤
seq(first.date,last.date,"day")
Run Code Online (Sandbox Code Playgroud)
创建这样一个序列。然而,调用
old.table[,date := seq(first.date,last.date,"day")])
Run Code Online (Sandbox Code Playgroud)
抛出异常
Error in seq.Date(first.date, last.date, "day") :
'from' must be of length 1
Run Code Online (Sandbox Code Playgroud)
这意味着,不可能对输入进行矢量化(至少不是这样)。
有没有办法获得所需的解决方案?
由于and 中seq只需要一个元素,我们可以按 'id' 分组(如果没有重复项),然后执行fromtoseq
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
Run Code Online (Sandbox Code Playgroud)
如果“ID”也重复,则按行顺序分组
setDT(old.table)[, .(date = seq(first.date, last.date, by = '1 day')),
by = .(ID, ID2 = seq_len(nrow(old.table)))]
Run Code Online (Sandbox Code Playgroud)