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

时间:2016-06-03 19:05:33

标签: r if-statement dplyr

Dataframe如下:

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

我想看看每个“目标”“来源”列表中是否存在“Source_Match”中的值。

最终结果应如下所示:

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

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

2 个答案:

答案 0 :(得分:6)

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%代替%in%。它是data.table包中专用于此案例的更快版本。 (谢谢,@ karun。)

另一个想法,来自@ eddi的comment

  

更快?替代方案:

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

答案 1 :(得分:0)

使用基础包。我确信有更多有效的方法可以使用基础包。

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)]

输出:

 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