如何将一列中逗号分隔的字符串与其他数据帧的逗号分隔字符串进行比较

时间:2017-07-06 18:25:18

标签: r stringstream

我有两个df,如下所示 DF1:

    M1     |
    -------+
    a,b,c  |
    a      |
    b,c    |
    c,b,a  |
    b,a,d  |
    d,a,b,c|
    a,d,c  |
    b      |
    c,d    |
    d,a    |

DF2:

X1      |X2
--------+---
a       |1
b       |2
c       |3
d       |4
a,b     |5
a,c     |6
a,d     |7
b,c     |8
b,d     |9
c,d     |10
a,b,c   |11
a,c,d   |12
a,b,d   |13
b,c,d   |14
a,b,c,d |15

有人可以帮助我匹配df1 $ M1和df2 $ X1中的值。并将相应的X2值放在M2列中,如下所示

DF1:

M1      |M2
--------+---
a,b,c   |11
a       |1
b,c     |8
c,b,a   |11
b,a,d   |13
d,a,b,c |15
a,d,c   |12
b       |2
c,d     |10
d,a     |7

有人可以帮助我

1 个答案:

答案 0 :(得分:0)

X1M1必须存储为字符。您可以查看str(df1),并在必要时df1 <- as.character(df1$X1)重新分配,df2

也相同

然后,使用按字母顺序排列的值创建新列:

df1$Ordered <- sapply(lapply(strsplit(df1$X1, ","), sort),paste,collapse=",")

df2$Ordered <- sapply(lapply(strsplit(df2$M1, ","), sort),paste,collapse=",")

然后像这样执行连接:

merge(df1, df2, by="Ordered")

如果要在df1中包含所有值,而不管它们是否在df2中具有匹配值,请添加all.x = TRUE参数。相同的逻辑适用于添加all = TRUE(包括两个数据框中的所有内容)或all.y = TRUE df2