通过ID查看另一列中是否存在一个值

nak*_*120 2 if-statement r dplyr

数据帧如下:

Target  Source      Source_Match
A       source1     source2
A       source2     source4
A       source3     source1
B       source1     source2
B       source3     source4
B       source4     source5
C       source5     source2
C       source6     source3
C       source7     source4
Run Code Online (Sandbox Code Playgroud)

我想看看"Source_Match"中的值是否存在于每个"Target"的"Source"列表中.

最终结果应如下所示:

Target  Source       Source_Match   Found In Target?
A       source1      source2        Yes
A       source2      source4        No
A       source3      source1        Yes
B       source1      source2        No
B       source3      source4        Yes
B       source4      source5        No
C       source5      source2        No
C       source6      source3        No
C       source7      source4        No
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒,谢谢!

Fra*_*ank 6

dplyrish的方式是:

library(dplyr)
DF %>% group_by(Target) %>% mutate(found = Source_Match %in% Source)
Run Code Online (Sandbox Code Playgroud)

类似的data.table代码是

library(data.table)
setDT(DF)
DF[, found := Source_Match %in% Source, by=Target]
Run Code Online (Sandbox Code Playgroud)

如果"source"列是字符类型,%chin%则可以代替使用%in%.它是data.table包中专用于此案例的更快版本.(谢谢,@ karun.)

还有另一个想法,来自@ eddi的评论:

更快?替代方案:

DF[, found := 'No'][DF, on = .(Target, Source_Match = Source), found := 'Yes']
Run Code Online (Sandbox Code Playgroud)

  • 更快?替代方案:`DF [,found:='No'] [DF,on =.(Target,Source_Match = Source),found:='Yes']` (3认同)