R 如何合并表并匹配具有多个因子的列的名称

R 如何合并表并匹配具有多个因子的列的名称,r,R,我想合并这两个表,但找不到更好的方法。通常,如果我使用merge,它必须至少有一列相互匹配 data<-data.frame(A=c("A1","A2","A3","A4"),B=c("13131,256","12141","256","684")) A B 1 A1 13131,256 2 A2 12141 3 A3 256 4 A4 684 有没有快速的方法来完成这件事 非常感谢 Linp我会分两步来做。首先根据您的分隔符(,“

我想合并这两个表,但找不到更好的方法。通常,如果我使用merge,它必须至少有一列相互匹配

data<-data.frame(A=c("A1","A2","A3","A4"),B=c("13131,256","12141","256","684"))
   A         B
1 A1 13131,256 
2 A2     12141
3 A3       256
4 A4       684
有没有快速的方法来完成这件事

非常感谢


Linp

我会分两步来做。首先根据您的分隔符(
,“
,在本例中为“”)拆分
数据$B中的ID,然后在第二个命令中使用
which
,从
BNAME
中获取相关的颜色名称。
*apply
系列在这里非常有用,可以迭代列中的每个元素:

ids <- sapply( data$B , function(x) c( strsplit( x , "," ) ) , USE.NAMES = FALSE )
[[1]]
[1] "13131" "256"  

[[2]]
[1] "12141"

[[3]]
[1] "256"

[[4]]
[1] "684"

data$NAME <- lapply( ids , function(x) BNAME$NAME[which( BNAME$B %in% x )] )
   A         B       NAME
1 A1 13131,256 Red, Green
2 A2     12141     Yellow
3 A3       256      Green
4 A4       684      Black

idsCRAN上全新的是我贡献的一个名为“”的包。对于这样的问题,它可能很方便

首先,安装软件包并加载它:

install.packages("splitstackshape", 
                 repos = "http://cran.cnr.berkeley.edu/", 
                 type = "source")
library(splitstackshape)
将“B”列拆分,将其重塑为“长”数据集,然后
将其与“BNAME”数据集合并

x <- merge(concat.split.multiple(data, "B", direction="long"), 
           BNAME, sort = FALSE)
x
#       B  A time   NAME
# 1 13131 A1    1    Red
# 2 12141 A2    1 Yellow
# 3   256 A3    1  Green
# 4   256 A1    2  Green
# 5   684 A4    1  Black

+我同意@SimonO101,但在未来,也要尝试分享你所做的尝试和你遇到的困难……可以。:)@阿南达·马托+1。这可能是我的方法:)但有两点:(1)您似乎假设
data.frame
s都使用
stringsAsFactors=FALSE
。使用问题中呈现的数据,“名称”列将转换为因子的整数值,除非在其中粘贴一些
as.character
s。(2) 输出中的“NAME”列是一个
列表
,我对此很满意,但可能会让许多用户感到困惑,特别是因为它与
write.csv
等内容不兼容。只需将其放入我的代码中,就可以解决所有问题。谢谢。:)接下来是@AnandaMahto的评论。(1). 我的数据输出是在这种格式下不起作用的因素,必须将其更改为字符。(2). 是的,输出是一个列表,我必须写入csv文件。插入了一个pplist(unlist())以使其正常工作。:)谢谢你的伟大解决方案!哦,我以前不知道这个包裹。我要试试看!:P谢谢@Ananda Mahto@林普,这是全新的。如果你发现任何错误,让我知道!
install.packages("splitstackshape", 
                 repos = "http://cran.cnr.berkeley.edu/", 
                 type = "source")
library(splitstackshape)
x <- merge(concat.split.multiple(data, "B", direction="long"), 
           BNAME, sort = FALSE)
x
#       B  A time   NAME
# 1 13131 A1    1    Red
# 2 12141 A2    1 Yellow
# 3   256 A3    1  Green
# 4   256 A1    2  Green
# 5   684 A4    1  Black
aggregate(cbind(B, NAME = as.character(NAME)) ~ A, 
          x, paste, collapse = ",")
#    A         B      NAME
# 1 A1 13131,256 Red,Green
# 2 A2     12141    Yellow
# 3 A3       256     Green
# 4 A4       684     Black