我如何在data.table中执行此合并操作

时间:2019-04-30 09:20:42

标签: r data.table

你好,我有一个简单的问题,我无法弄清data.table

library(data.table)
X = structure(list(id = c("1544546095089426537", "1544546096067952694", 
"1544546097110012530", "1544546098119312996", "1544546099138807323", 
"1544546100158707601", "1544546101162116936", "1544546102181067223", 
"1544546103195166875", "1544546103195166875", "1544546103195166875", 
"1544546106224788360", "1544546106224788360", "1544546108267033496", 
"1544546108267033496", "1544546110293800776", "1544546110293800776", 
"1544546112321694403", "1544546112321694403", "1544546114351588355", 
"1544546114351588355", "1544546116381551556", "1544546116381551556", 
"1544546118406016434", "1544546118406016434", "1544546120433126896", 
"1544546120433126896", "1544546122461220617", "1544546122461220617", 
"1544546124489327694", "1544546124489327694", "1544546126517474819", 
"1544546126517474819", "1544546126517474819"), IDX = c(637197L, 
639751L, 641225L, 643656L, 645993L, 650042L, 652171L, 654794L, 
657097L, 659672L, 662427L, 664974L, 667283L, 669609L, 671840L, 
673826L, 675517L, 677878L, 679745L, 681284L, 682426L, 685156L, 
687228L, 689568L, 692729L, 693825L, 695525L, 697468L, 698269L, 
700319L, 702261L, 706292L, 707375L, 708272L), original_id = c("1544546095089426537", 
"1544546095089426537", "1544546096067952694", "1544546097110012530", 
"1544546098119312996", "1544546099138807323", "1544546100158707601", 
"1544546101162116936", "1544546102181067223", "1544546103195166875", 
"1544546103195166875", "1544546103195166875", "1544546106224788360", 
"1544546106224788360", "1544546108267033496", "1544546108267033496", 
"1544546110293800776", "1544546110293800776", "1544546112321694403", 
"1544546112321694403", "1544546114351588355", "1544546114351588355", 
"1544546116381551556", "1544546116381551556", "1544546118406016434", 
"1544546118406016434", "1544546120433126896", "1544546120433126896", 
"1544546122461220617", "1544546122461220617", "1544546124489327694", 
"1544546124489327694", "1544546126517474819", "1544546126517474819"
)), .Names = c("id", "IDX", "original_id"), row.names = c(NA, 
-34L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x12c7bf8>)

X
                     id    IDX         original_id
 1: 1544546095089426537 637197 1544546095089426537
 2: 1544546096067952694 639751 1544546095089426537
 3: 1544546097110012530 641225 1544546096067952694
 4: 1544546098119312996 643656 1544546097110012530
 5: 1544546099138807323 645993 1544546098119312996
 6: 1544546100158707601 650042 1544546099138807323
 7: 1544546101162116936 652171 1544546100158707601
 8: 1544546102181067223 654794 1544546101162116936
 9: 1544546103195166875 657097 1544546102181067223
10: 1544546103195166875 659672 1544546103195166875
11: 1544546103195166875 662427 1544546103195166875
12: 1544546106224788360 664974 1544546103195166875
13: 1544546106224788360 667283 1544546106224788360
14: 1544546108267033496 669609 1544546106224788360
15: 1544546108267033496 671840 1544546108267033496
16: 1544546110293800776 673826 1544546108267033496
17: 1544546110293800776 675517 1544546110293800776
18: 1544546112321694403 677878 1544546110293800776
19: 1544546112321694403 679745 1544546112321694403
20: 1544546114351588355 681284 1544546112321694403
21: 1544546114351588355 682426 1544546114351588355
22: 1544546116381551556 685156 1544546114351588355
23: 1544546116381551556 687228 1544546116381551556
24: 1544546118406016434 689568 1544546116381551556
25: 1544546118406016434 692729 1544546118406016434
26: 1544546120433126896 693825 1544546118406016434
27: 1544546120433126896 695525 1544546120433126896
28: 1544546122461220617 697468 1544546120433126896
29: 1544546122461220617 698269 1544546122461220617
30: 1544546124489327694 700319 1544546122461220617
31: 1544546124489327694 702261 1544546124489327694
32: 1544546126517474819 706292 1544546124489327694
33: 1544546126517474819 707375 1544546126517474819
34: 1544546126517474819 708272 1544546126517474819
                     id    IDX         original_id

基本上,我有一个id <-> IDX映射和另一列original_id,我想添加一列original_IDX,以便对每一行ioriginal_IDX_iIDX值中IDX[id == original_d_i]的最后一个original_IDX_i<IDX_i值(最大)

我希望前12行是

                     id    IDX         original_id original_IDX
 1: 1544546095089426537 637197 1544546095089426537           NA
 2: 1544546096067952694 639751 1544546095089426537       637197
 3: 1544546097110012530 641225 1544546096067952694       639751
 4: 1544546098119312996 643656 1544546097110012530       641225
 5: 1544546099138807323 645993 1544546098119312996       643656
 6: 1544546100158707601 650042 1544546099138807323       645993
 7: 1544546101162116936 652171 1544546100158707601       650042
 8: 1544546102181067223 654794 1544546101162116936       652171
 9: 1544546103195166875 657097 1544546102181067223       654794
10: 1544546103195166875 659672 1544546103195166875       657097
11: 1544546103195166875 662427 1544546103195166875       659672
12: 1544546106224788360 664974 1544546103195166875       662427

2 个答案:

答案 0 :(得分:2)

您可以使用非等额联接,然后通过引用进行更新,如下所示:

X[, mi := X[X, on=.(id=original_id, IDX<IDX), max(x.IDX)]$V1]

输出:

                     id    IDX         original_id     mi
 1: 1544546095089426537 637197 1544546095089426537     NA
 2: 1544546096067952694 639751 1544546095089426537 637197
 3: 1544546097110012530 641225 1544546096067952694 639751
 4: 1544546098119312996 643656 1544546097110012530 641225
 5: 1544546099138807323 645993 1544546098119312996 643656
 6: 1544546100158707601 650042 1544546099138807323 645993
 7: 1544546101162116936 652171 1544546100158707601 650042
 8: 1544546102181067223 654794 1544546101162116936 652171
 9: 1544546103195166875 657097 1544546102181067223 654794
10: 1544546103195166875 659672 1544546103195166875 657097
11: 1544546103195166875 662427 1544546103195166875 659672
12: 1544546106224788360 664974 1544546103195166875 662427
13: 1544546106224788360 667283 1544546106224788360 664974
14: 1544546108267033496 669609 1544546106224788360 667283
15: 1544546108267033496 671840 1544546108267033496 669609
16: 1544546110293800776 673826 1544546108267033496 671840
17: 1544546110293800776 675517 1544546110293800776 673826
18: 1544546112321694403 677878 1544546110293800776 675517
19: 1544546112321694403 679745 1544546112321694403 677878
20: 1544546114351588355 681284 1544546112321694403 679745
21: 1544546114351588355 682426 1544546114351588355 681284
22: 1544546116381551556 685156 1544546114351588355 682426
23: 1544546116381551556 687228 1544546116381551556 685156
24: 1544546118406016434 689568 1544546116381551556 687228
25: 1544546118406016434 692729 1544546118406016434 689568
26: 1544546120433126896 693825 1544546118406016434 692729
27: 1544546120433126896 695525 1544546120433126896 693825
28: 1544546122461220617 697468 1544546120433126896 695525
29: 1544546122461220617 698269 1544546122461220617 697468
30: 1544546124489327694 700319 1544546122461220617 698269
31: 1544546124489327694 702261 1544546124489327694 700319
32: 1544546126517474819 706292 1544546124489327694 702261
33: 1544546126517474819 707375 1544546126517474819 706292
34: 1544546126517474819 708272 1544546126517474819 707375
                     id    IDX         original_id     mi

答案 1 :(得分:2)

以下提供@ chinsoon12似乎可以达到相同的结果

X[X, on = .(original_id=id, IDX>IDX), original_IDX:=i.IDX]