R 按ID查看另一列中是否存在一个值

R 按ID查看另一列中是否存在一个值,r,if-statement,dplyr,R,If Statement,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 sour

数据帧如下所示:

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
我想看看每个“目标”的“源”列表中是否存在“源匹配”中的值

最终结果应如下所示:

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
任何帮助都会很好,谢谢

dplyrish的方式是:

library(dplyr)
DF %>% group_by(Target) %>% mutate(found = Source_Match %in% Source)

类似的data.table代码是

library(data.table)
setDT(DF)
DF[, found := Source_Match %in% Source, by=Target]
如果“源”列为字符类型,则可以使用
%chin%
代替%中的
%。data.table包中提供了专门针对这种情况的更快版本。(谢谢,@akrun。)

另一个想法来自@eddi's:

快一点?备选方案:

DF[, found := 'No'][DF, on = .(Target, Source_Match = Source), found := 'Yes']

使用基本包。我相信有很多更有效的方法可以使用基本包来实现这一点

df1 <- df[, c(1,2)]
df2 <- df[, c(1,3)]
colnames(df2) <- colnames(df1)
df$found <- duplicated(rbind(df1,df2))[(nrow(df)+1):(nrow(df)*2)]

我看不到模式,您能进一步解释一下吗?我无法安装包:data。frame@Nick对不起,我没想清楚。应该在那里写dplyr而不是data.frame。修好了,谢谢!所以第一部分对我不起作用,但第二部分起作用。谢谢快一点?备选方案:
DF[,发现:='No'][DF,on=(目标,源匹配=源),发现:='Yes']
 Target  Source Source_Match found
1      A source1      source2  TRUE
2      A source2      source4 FALSE
3      A source3      source1  TRUE
4      B source1      source2 FALSE
5      B source3      source4  TRUE
6      B source4      source5 FALSE
7      C source5      source2 FALSE
8      C source6      source3 FALSE
9      C source7      source4 FALSE