我有一个这样的DF:
lineRecoveriesChartData: any[] = [ {data: this.arrayFromServer, label: '', borderColor: "black", fill: false}, {data: this.array2FromServer, label: '', borderColor: "black", fill: false} ];
我正在寻找一个看起来像这样的结果列:
ID_A <- c(NA,NA,132,NA,NA,NA,248,NA)
ID_B <- c(132,248,248,381,248,290,290,132)
entry <- c(1,2,2,3,4,5,5,6)
df <- data.frame(ID_A,ID_B,entry)
对于ID_A不是df$result <- c(NA,NA,1,NA,NA,NA,4,NA)
的每一行,我想在条目col中找到相应的值,其中:1)ID_A匹配ID_B,以及2)ID_A的输入列是不大于该值的最大值。我们在ID_B中匹配的ID_A行的输入值。
我的尝试似乎已经结束,但目前找不到正确的值:
NA
答案 0 :(得分:1)
如果您的数据按entry
排序(如示例中所示)...
library(data.table)
setDT(df)
df[!is.na(ID_A), v :=
df[.SD, on=.(ID_B = ID_A, entry < entry), mult="last", x.entry]
]
ID_A ID_B entry result v
1: NA 132 1 NA NA
2: NA 248 2 NA NA
3: 132 248 2 1 1
4: NA 381 3 NA NA
5: NA 248 4 NA NA
6: NA 290 5 NA NA
7: 248 290 5 4 4
8: NA 132 6 NA NA
工作原理
x[i, ..., j]
在j
确定的x
的子集上执行i
。
i
中的过滤条件来定义一个简单的子集,例如!is.na(ID_A)
。i
中的表的联接来定义子集。这里,x = df
与i = .SD = df[!is.na(ID_A)]
(第一个项目符号中定义的“数据子集”)的连接; on=
和mult=
是联接的条件。 on=
条件的写法类似于.(xcol1 = icol1, xcol2 < icol2)
,其中xcol
属于x
,而icol
s属于i
。在联接之后的j
中,可以在此处使用前缀x.entry
之类的前缀来访问每个表的cols,以消除要从哪个表中提取歧义。
mult=
确定在on=
条件中有多个匹配项时会发生什么。在这里,我们的ID 248的条目分别为2和4。由于数据是按entry
排序(在给定的ID_B
内),所以mult="last"
将选择较大的值。
最后,j
可用于修改列,例如x[i, ..., newcol := values]
,该列仅对x
定义的i
的子集起作用。