2017-07-06 19 views
1

我有两个DF如下 DF1:如何逗号seprated串用逗号比较一列seprated串等datframe

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。并把列M2对应的X2值,如下

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 

有人可以帮助我

回答

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)。

+0

仔细看看'd,a,b,c' ='a,b,c,d' – HubertL

+0

我想要一个解决方案,以便它独立于逗号周围的值序列 if df1 $ M1 [6 ]是d,a,b,c 它应该给出对应于df2 $ X1 [15](a,b,c,d)的df1 $ M2 [6]的值,即df2 $ X2 [15] – aman

+0

@aman我修改了我的答案,以反映创建要加入的每列的排序版本。 – Mako212