首页 > 解决方案 > 一列的一部分是否存在于另一列中?R

问题描述

我有这个数据框:

df <- data.frame(id_1=c('888046309', '888046309', '888046309', '888046309', '003046309', '465798132', '465798132', '465798132', '465798132', '465798132', '465798132', '465798132', '465798132'), 
                 id_2=c('0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309', '0003046309'))

我想创建一个id_2指示id_1.

我从这个建议中尝试了这个

i <- sapply(seq_along(df$id_2), function(i) grepl(df$id_2[i], df$id_1[i]))

df$flag <- c("No", "Yes")[i + 1L]

并且 flag 具有所有 NO 值,即使您可以看到 46309 都存在于id_1&id_2中。

然后我从这个建议中尝试了这个

df$flag_2 <- str_detect(df$id_1, df$id_2)

我得到了 FALSEflag_2

最后我尝试了这个,就像flag_2,我得到了所有的错误flag_3

df <- df %>% 
    mutate(flag_3 = c('No', 'Yes')[1+str_detect(id_1, as.character(id_2))])

是否可以编辑这些建议以指示其中id_2是否存在某些部分id_1

标签: rdataframe

解决方案


我不确定这是否是您的想法,我尝试过并取得了一些令人鼓舞的结果,但仍有改进的余地。为此,我0id_2可能不是一个好的调用中删除了 2,但它有助于在这里进行模糊匹配。

df$flag <- sapply(1:nrow(df), function(x) agrepl(substr(df$id_2[x], 2, nchar(df$id_2[x])), 
                                                 df$id_1[x], max.distance = 4))


df

        id_1       id_2  flag
1  888046309 0003046309  TRUE
2  888046309 0003046309  TRUE
3  888046309 0003046309  TRUE
4  888046309 0003046309  TRUE
5  003046309 0003046309  TRUE
6  465798132 0003046309 FALSE
7  465798132 0003046309 FALSE
8  465798132 0003046309 FALSE
9  465798132 0003046309 FALSE
10 465798132 0003046309 FALSE
11 465798132 0003046309 FALSE
12 465798132 0003046309 FALSE
13 465798132 0003046309 FALSE

推荐阅读