R:基于分离和匹配以两种特定方式格式化数据帧
我有这样一个df1: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
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
相同吗?