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

橘子人51

我有一个这样的 DF:

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)

我希望添加一个如下所示的结果列:

df$result <- c(NA,NA,1,NA,NA,NA,4,NA)

对于每一行,如果 ID_A 不是NA,我想在条目列中找到相应的值,其中:1)ID_A 匹配 ID_B 和 2)ID_A 的条目列是不大于 ID_A 行的条目值的最大值我们在 ID_B 中匹配。

我的尝试,感觉可能很接近,但目前没有找到正确的值:

df$result <- ifelse(is.na(df$ID_A),NA,df$entry[match(df$ID_A,df$ID_B) & !duplicated(df$ID_B,fromLast = TRUE)])
坦率

如果您的数据按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 = dfwith i = .SD = df[!is.na(ID_A)],第一个项目符号中定义的“数据子集”;andon=mult=是连接的条件。

on=条件是这样写的.(xcol1 = icol1, xcol2 < icol2),其中xcols时对应xicols到i在连接j之后,每个表中的列都可以使用像x.entry这里这样的前缀来访问,以消除从哪个表中提取的歧义。

mult=确定当条件中有多个匹配项时会发生什么on=在这里,我们的 ID 为 248,在 2 和 4 处都有条目。由于数据按entry(在给定 内ID_B排序mult="last"将选择较大的值。

最后,j可用于修改列,如x[i, ..., newcol := values],它只对由x定义的子集进行操作i

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档