R:基于分离和匹配以两种特定方式格式化数据帧

R:基于分离和匹配以两种特定方式格式化数据帧,r,dataframe,R,Dataframe,我有这样一个df1: A B 1 xxx B2341; A3456 2 yyy B2341; CC6x; GG63 3 zzz CC6X 4 www GG63 5 kkk 5634 为了获得df1,我使用以下命令 df1 <- data.frame(A=c("xxx", "yyy", "zzz", "www", "kkk"), B=c("B2341; A345

我有这样一个df1:

    A                 B
1 xxx      B2341; A3456
2 yyy B2341; CC6x; GG63
3 zzz              CC6X
4 www              GG63
5 kkk              5634
为了获得df1,我使用以下命令

 df1 <- data.frame(A=c("xxx", "yyy", "zzz", "www", "kkk"), B=c("B2341; A3456", "B2341; CC6x; GG63", "CC6X", "GG63", "5634"))
在第二步中,我想根据df2的第二列的匹配结果得到一个表,即xxx和yyy在df2的第二列都得到了B2341。yyy和zzz也获得了CC6X;yyy和www也获得了GG63

因此,我希望df有两列,显示匹配的行,例如:

xxx yyy
yyy zzz
yyy www
请帮助指导如何以更智能的方式获取基于我的df1和R的两个数据帧。谢谢。

第一步:

library(reshape)
x <- melt((strsplit(as.character(df1$B), "; ")))
x <- data.frame("A"=df1[x$L1,1],"B"=x$value)
步骤2:

y <- unique(merge(x,x[duplicated(x$B),],by="B")[2:3])
y[y$A.x != y$A.y,]
注意:第2步的结果与您指定的不完全一致,因为我相信您将“CC6X”误输入为“CC6X”,如果您希望它忽略大写字母,我建议
x$B第一步:

library(reshape)
x <- melt((strsplit(as.character(df1$B), "; ")))
x <- data.frame("A"=df1[x$L1,1],"B"=x$value)
步骤2:

y <- unique(merge(x,x[duplicated(x$B),],by="B")[2:3])
y[y$A.x != y$A.y,]

注意:第2步没有完全按照您指定的那样进行,因为我相信您将“CC6X”误输入为“CC6X”,如果您希望它忽略大写,我建议
x$B这看起来像是
foreach
包的工作。我用R写的东西都用它

library(foreach)
foreach(a=df1$A, b=as.character(df1$B), .combine=rbind) %do% {
    data.frame(A=a, B=strsplit(b, "; ")[[1]])
}
输出:

    A     B
1 xxx B2341
2 xxx A3456
3 yyy B2341
4 yyy  CC6x
5 yyy  GG63
6 zzz  CC6X
7 www  GG63
8 kkk  5634

这看起来像是
foreach
包的作业。我用R写的东西都用它

library(foreach)
foreach(a=df1$A, b=as.character(df1$B), .combine=rbind) %do% {
    data.frame(A=a, B=strsplit(b, "; ")[[1]])
}
输出:

    A     B
1 xxx B2341
2 xxx A3456
3 yyy B2341
4 yyy  CC6x
5 yyy  GG63
6 zzz  CC6X
7 www  GG63
8 kkk  5634

CC6x
其中x是小写,应该与
CC6x
相同吗
CC6x
其中x是小写,应该与
CC6x
相同吗?