【问题标题】:Finding strings shared between two dataframe columns查找在两个数据框列之间共享的字符串
【发布时间】:2017-02-17 16:00:12
【问题描述】:

我有一个包含两列分隔字符串的数据框:

df <- data.frame('a'=c('a, b, c, d', 'a, c', 'b, d'), 'b'=c('a, d', 'a', 'a, d'))

           a      b
1 a, b, c, d   a, d
2       a, c      a
3       b, d   a, d

我想创建第三列来包含与前两列相交的字符串,例如:

           a      b      c
1 a, b, c, d   a, d   a, d
2       a, c      a      a
3       b, d   a, d      d

我尝试了多种方法,包括将字符串转换为列表并返回,但我似乎无法正确处理。

使用dplyr我第一次尝试使用:

df <- df %>%
    mutate(c=paste(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", "))))))

导致错误:

eval(substitute(expr), envir, enclos) 中的错误: 结果大小错误 (2),预期为 3 或 1

除了不返回所需的字符串外,这似乎还为每一行返回相同大小的结果(通过将上面的 mutate 函数从下面的 paste 更改为 length 来验证):

df %>%
    mutate(c=length(c(intersect(unlist(strsplit(a, split=", ")), unlist(strsplit(b, split=", "))))))

           a    b   c
1 a, b, c, d a, d   2
2       a, c    a   2
3       b, d a, d   2

这让我担心我所有的行结果都被合并为一个结果并重复。

为了简化事情,我尝试在使用 intersect 函数之前将字符串转换为列表:

df %>% mutate(a_list=list(unlist(strsplit(a, split=", "))))

但收到错误:

eval(substitute(expr), envir, enclos) 中的错误: 与STRSXP不兼容

这让人怀疑数据框中的列表是否与tidyverse 兼容,因此,我是否需要采取完全不同的方法。

任何关于如何解决在 R 中的两个数据框列之间查找共享字符串的问题的建议(以及任何关于如何处理数据框中类似列表的值的见解)都将不胜感激。

【问题讨论】:

    标签: r list dataframe dplyr intersection


    【解决方案1】:

    此基本 R 方法将起作用:使用 strsplit 将变量拆分为列表,每个元素为一个字符向量。 mapply 函数获取列表并将以下操作应用于每个列表中位于相同位置的元素对。然后使用insersect 查找重叠元素并使用paste 折叠将它们粘贴在一起。

    df$c <- mapply(function(x, y) paste(intersect(x, y), collapse=", "),
                   strsplit(df$a, ", "), strsplit(df$b, ", "))
    
    df
               a    b    c
    1 a, b, c, d a, d a, d
    2       a, c    a    a
    3       b, d a, d    d
    

    数据

    df <- data.frame('a'=c('a, b, c, d', 'a, c', 'b, d'),
                     'b'=c('a, d', 'a', 'a, d'), stringsAsFactors=FALSE)
    

    【讨论】:

    • 太好了,谢谢,我可能有点过于热衷于使用 dplyr。
    【解决方案2】:

    你可以试试:

    library(stringr)
    # go go through each row, extract the letters, search for duplicates and paste together
    apply(df, 1, function(x){
      tmp <- str_trim(unlist(str_split(x,",")))
      paste(tmp[duplicated(tmp)],collapse=", ")
     })
    [1] "a, d" "a"   "d" 
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多