【问题标题】:Find column value contained in another column R查找另一列 R 中包含的列值
【发布时间】:2017-06-09 22:45:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: r string-concatenation


    【解决方案1】:

    我们将split第二列和第三列乘以一个或多个空格(\\s+),然后将paste对应行的unionmapply创建'组合'

    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"
    

    【讨论】:

    • 这是完美的,我没有想过使用联合 - 但这基本上就是我想要的。非常感谢。
    【解决方案2】:

    这是实现此目的的一种方法,其中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
    

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多