首页 文章

查找两个数据帧列之间共享的字符串

提问于
浏览
0

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

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中的错误(替换(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中的错误(替换(expr),envir,enclos):与STRSXP不兼容

这让人怀疑数据帧中的列表是否与 tidyverse 兼容,因此,如果我需要采用完全不同的方法 .

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

2 回答

  • 0

    这个基本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
    

    data

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

    你可以试试:

    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"
    

相关问题