【问题标题】:Seeing if one value exists in another column by ID通过 ID 查看另一列中是否存在一个值
【发布时间】:2016-10-03 22:54:16
【问题描述】:

数据框如下:

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”列表中。

最终结果应如下所示:

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

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

【问题讨论】:

  • 我没有看到模式,你能进一步解释一下

标签: r if-statement dplyr


【解决方案1】:

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 包中专门针对这种情况的更快版本。 (谢谢,@akrun。)

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

更快?替代方案:

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

【讨论】:

  • 我无法安装包:data.frame
  • @Nick 对不起,我没有想清楚。应该在那里写 dplyr 而不是 data.frame 。固定
  • 好的,谢谢!所以第一个对我不起作用,但第二部分对我有用。谢谢!
  • 更快?替代:DF[, found := 'No'][DF, on = .(Target, Source_Match = Source), found := 'Yes']
【解决方案2】:

使用基础包。我确信使用 base 包有更有效的方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2014-01-30
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-26
    • 1970-01-01
    相关资源
    最近更新 更多