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

标签 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这样对于每一行 i , original_IDX_i是最后一个(如最大)IDX 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

最佳答案

您可以使用非等值连接,然后按如下方式通过引用进行更新:

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

关于r - 如何在 data.table 中执行此合并操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55917741/

相关文章:

r - 基于社区更改 IGraph 图中的布局结构

r - 如何将带有逗号分隔记录的向量 reshape 为纵向数据框?

r - 转换 data.table 中的列类

r - data.table:在组内符号出现之前/之后标记

r - R 中的异常处理和堆栈展开

r - 使用 "boot"包进行引导的 GPU 计算

r - 如何在 R varImpPlot 中操作 y 轴文本标签?

r - data.table:按小时增加 IDateTime 以滞后每小时数据

r - 按组和逻辑表达式对行进行子集化 - data.table

R删除data.table中的多个文本字符串