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
任何帮助都会很棒,谢谢!
答案 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