我的数据
我有一个 data.table DT
,其中当前 ( F0YR
) 和下一个 ( F1YR
) 财政年度结束 (FYE) 编码为整数。由于每个下一个 FYE 最终都会成为当前的 FYE,因此整数将同时在列F1YR
和F0YR
中。此外,我的数据包含每月观察结果,因此相同的 FYE 将多次出现在数据集中:
library(data.table)
DT <- data.table(ID = rep(c("A", "B"), each=9),
MONTH = rep(100L:108L, times=2),
F0YR = rep(c(1L, 4L, 7L), each=3, times=2),
F1YR = rep(c(4L, 7L, 9L), each=3, times=2),
value = c(rep(1:5, each=3), 6, 6, 7),
key = "ID,F0YR")
DT
ID MONTH F0YR F1YR value
[1,] A 100 1 4 1
[2,] A 101 1 4 1
[3,] A 102 1 4 1
[4,] A 103 4 7 2
[5,] A 104 4 7 2
[6,] A 105 4 7 2
[7,] A 106 7 9 3
[8,] A 107 7 9 3
[9,] A 108 7 9 3
[10,] B 100 1 4 4
[11,] B 101 1 4 4
...
我想做的事
对于每个ID
andF1YR
组合,我想获得ID
andF0YR
组合的值。例如:A 公司的2
值为FOYR==4
。现在,我想要一个用于所有组合的附加列,ID=="A"
它F1YR==4
设置为 2,在已经存在的值 1 旁边。
我试过的
intDT <- DT[CJ(unique(ID), unique(F0YR)), list(ID, F0YR, valueNew = value), mult="last"]
setkey(intDT, ID, F0YR)
setkey(DT, ID, F1YR)
DT <- intDT[DT]
setnames(DT, c("F0YR.1", "F0YR"), c("F0YR", "F1YR"))
DT
ID F1YR valueNew MONTH F0YR value
[1,] A 4 2 100 1 1
[2,] A 4 2 101 1 1
[3,] A 4 2 102 1 1
[4,] A 7 3 103 4 2
[5,] A 7 3 104 4 2
[6,] A 7 3 105 4 2
[7,] A 9 NA 106 7 3
[8,] A 9 NA 107 7 3
[9,] A 9 NA 108 7 3
[10,] B 4 5 100 1 4
[11,] B 4 5 101 1 4
...
(请注意,我mult="last"
在这里使用是因为,虽然值应该只随着 F0YR 或 F1YR 的变化而变化,但有时它们不会变化,这只是我的决胜局)。
我想要的是
这看起来可以改进。首先,我必须复制我的 DT。其次,由于我加入的基本相同data.table
,所以所有列名都具有相同的名称,我必须重命名它们。我认为这self join
将是前进的道路,但我尝试了又尝试,无法得到一个好的解决方案。我希望那里有一些我看不到的简单的东西……有人知道吗?还是我的数据设置方式实际上很难(可能是因为我有每月观察,但只想加入每季度或每年变化的值)。