我有一个月度数据data.table
和另一个年度数据data.table
,现在我想将年度数据与月度数据中的相应观察值相匹配。
我的方法如下:复制每个月的年度数据,然后加入月度和年度数据。现在我有一个关于行重复的问题。我知道该怎么做,但我不确定这是否是最好的方法,所以一些意见会很棒。
这是data.table DT
我的年度数据以及我目前如何复制的示例:
library(data.table)
DT <- data.table(ID = paste(rep(c("a", "b"), each=3), c(1:3, 1:3), sep="_"),
values = 10:15,
startMonth = seq(from=1, by=2, length=6),
endMonth = seq(from=3, by=3, length=6))
DT
ID values startMonth endMonth
[1,] a_1 10 1 3
[2,] a_2 11 3 6
[3,] a_3 12 5 9
[4,] b_1 13 7 12
[5,] b_2 14 9 15
[6,] b_3 15 11 18
#1. Alternative
DT1 <- DT[, list(MONTH=startMonth:endMonth), by="ID"]
setkey(DT, ID)
setkey(DT1, ID)
DT1[DT]
ID MONTH values startMonth endMonth
a_1 1 10 1 3
a_1 2 10 1 3
a_1 3 10 1 3
a_2 3 11 3 6
[...]
最后一次加入正是我想要的。但是,DT[, list(MONTH=startMonth:endMonth), by="ID"]
除了将其他列添加到之外,我已经做了我想要的一切DT
,所以我想知道我是否可以摆脱代码中的最后三行,即setkey
andjoin
操作。事实证明,您可以,只需执行以下操作:
#2. Alternative: More intuitiv and just one line of code
DT[, list(MONTH=startMonth:endMonth, values, startMonth, endMonth), by="ID"]
ID MONTH values startMonth endMonth
a_1 1 10 1 3
a_1 2 10 1 3
a_1 3 10 1 3
a_2 3 11 3 6
...
但是,这仅有效,因为我将列名硬编码到list
表达式中。在我的真实数据中,我事先不知道所有列的名称,所以我想知道是否可以告诉我data.table
返回MONTH
我计算的列,如上所示以及DT
. .SD
似乎能够做到这一点,但是:
DT[, list(MONTH=startMonth:endMonth, .SD), by="ID"]
Error in `[.data.table`(DT, , list(YEAR = startMonth:endMonth, .SD), by = "ID") :
maxn (4) is not exact multiple of this j column's length (3)
总而言之,我知道它是如何完成的,但我只是想知道这是否是最好的方法,因为我仍然在为语法而苦苦挣扎,data.table
并且经常在帖子和维基上阅读做事的好方法和坏方法。另外,我不太明白为什么在使用.SD
. 我认为这是告诉data.table
您想要所有列的任何简单方法。我想念什么?