我有一个包含两列分隔字符串的数据框:
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 回答
这个基本R方法将起作用:使用
strsplit
将变量拆分为列表,每个元素都是一个字符向量 .mapply
函数获取列表并将以下操作应用于每个列表中位于同一位置的元素对 . 然后使用insersect
查找重叠元素,使用折叠paste
将这些元素粘贴在一起 .data
你可以试试: