查找另一列R中包含的列值

时间:2017-06-09 22:45:50

标签: r string-concatenation

我有多列地址,可能包含重复的信息(但通常不会有完全重复的信息)。

以下代码将提供我的问题的示例

id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2) 
df$combined = paste(add1, add2)
df

这给出了以下结果,

  id      add1             add2                  combined
1   1 21ST AVE 21ST AVE BLAH ST 21ST AVE 21ST AVE BLAH ST
2   2   5TH ST   EAST BLAH BLVD     5TH ST EAST BLAH BLVD

我需要的结论如下,

  id      add1             add2                  combined
1   1 21ST AVE 21ST AVE BLAH ST          21ST AVE BLAH ST
2   2   5TH ST   EAST BLAH BLVD     5TH ST EAST BLAH BLVD

我想确定add1add2中包含的内容是否包含add2。如果我发现add1包含{{1}}提供的相同信息,那么我要么避免将这些特定列值组合在一起,要么删除组合列中的重复信息(我认为这需要解决不同的问题)字符串中重复短语的问题)。我找不到找到“包含在'而不是'精确'中的列值的示例 - 我正在使用数据集中超过500K的情况,这个问题很常见。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我们split第二和第三列有一个或多个空格(\\s+),然后是paste union对应行mapply来创建'合并'

lst <- lapply(df[2:3], function(x) strsplit(as.character(x), "\\s+"))
df$combined <- mapply(function(x,y) paste(union(x, y), collapse=" "), lst$add1, lst$add2)
df$combined
#[1] "21ST AVE BLAH ST"      "5TH ST EAST BLAH BLVD"

或另一个选项是gsub

gsub("((\\w+\\s*){2,})\\1", "\\1", do.call(paste, df[2:3]))
#[1] "21ST AVE BLAH ST"      "5TH ST EAST BLAH BLVD"

答案 1 :(得分:1)

以下是实现此目的的一种方法:ifelse测试add1是否在add2中,如果是,则不包括它,否则它将它们组合在一起:

id= c(1, 2)
add1 = c("21ST AVE", "5TH ST")
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD")
df = data.frame(id, add1, add2, stringsAsFactors = F) 

require(stringr)
require(dplyr)

df %>% mutate(combined = ifelse(str_detect(add2, add1), 
                                add2, 
                                str_c(add1, add2)))

输出:

  id     add1             add2             combined
1  1 21ST AVE 21ST AVE BLAH ST     21ST AVE BLAH ST
2  2   5TH ST   EAST BLAH BLVD 5TH STEAST BLAH BLVD