我有一个这样的 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 = df
with i = .SD = df[!is.na(ID_A)]
,第一个项目符号中定义的“数据子集”;andon=
和mult=
是连接的条件。该on=
条件是这样写的.(xcol1 = icol1, xcol2 < icol2)
,其中xcol
s时对应x
和icol
s到i
。在连接j
之后,每个表中的列都可以使用像x.entry
这里这样的前缀来访问,以消除从哪个表中提取的歧义。
mult=
确定当条件中有多个匹配项时会发生什么on=
。在这里,我们的 ID 为 248,在 2 和 4 处都有条目。由于数据按entry
(在给定 内ID_B
)排序,mult="last"
将选择较大的值。
最后,j
可用于修改列,如x[i, ..., newcol := values]
,它只对由x
定义的子集进行操作i
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句