![](/img/trans.png)
[英]How to add certain rows from a column in one data.table to another data.table under a heading?
[英]How to best join one column of a data.table with another column of the same data.table?
我有一個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
和F1YR
組合,我想獲得ID
和F0YR
組合的值。 例如:對於FOYR==4
公司A的值為2
。 現在,我希望為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
將是前進的方向,但我嘗試並嘗試過,無法得到一個好的解決方案。 我希望有一些簡單的東西,我只是沒有看到......有沒有人有線索? 或者我的數據設置方式實際上很難(可能是因為我有月度觀察,但只想加入季度或年度變化值)。
在這樣的用例中,口頭禪“首先聚合,然后加入”通常會有所幫助。 因此,從您的DT
開始,並使用v1.8.1:
> agg = DT[,last(value),by=list(ID,F0YR)]
> agg
ID F0YR V1
1: A 1 1
2: A 4 2
3: A 7 3
4: B 1 4
5: B 4 5
6: B 7 7
我稱之為agg
因為我想不出一個更好的名字。 在這種情況下,你想要的last
並不是真正的聚合,但是你知道我的意思。
然后按組引用更新DT
。 這里我們通過分組i
。
setkey(DT,ID,F1YR)
DT[agg,newcol:=V1]
ID MONTH F0YR F1YR value newcol
1: A 100 1 4 1 2
2: A 101 1 4 1 2
3: A 102 1 4 1 2
4: A 103 4 7 2 3
5: A 104 4 7 2 3
6: A 105 4 7 2 3
7: A 106 7 9 3 NA
8: A 107 7 9 3 NA
9: A 108 7 9 3 NA
10: B 100 1 4 4 5
11: B 101 1 4 4 5
12: B 102 1 4 4 5
13: B 103 4 7 5 7
14: B 104 4 7 5 7
15: B 105 4 7 5 7
16: B 106 7 9 6 NA
17: B 107 7 9 6 NA
18: B 108 7 9 7 NA
是對的嗎? 不確定我是否完全遵循。 那些操作應該非常快,沒有任何副本,並且應該擴展到大數據。 至少,這是意圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.