来自col2中col1的匹配ID,如果该行的col3值小于col1中要匹配的行中col3的值,则取该值

时间:2018-08-03 15:52:15

标签: r

我有一个这样的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

1 个答案:

答案 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 = dfi = .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的子集起作用。