3

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

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

我想根据下表合并B列:

BNAME<-data.frame(NAME=c("Red","Green","Yellow","Black"),B=c("13131","256","12141","684"))
    NAME     B
1    Red 13131
2  Green   256
3 Yellow 12141
4  Black   684

所以最终的格式应该是这样的:

  A         B      NAME
1 A1 13131,256 Red,Green
2 A2     12141    Yellow
3 A3       256     Green
4 A4       684     Black

有没有一种快速的方法来完成这项工作?

非常感谢!!

林普

4

2 回答 2

3

我会分两步做。首先data$B根据您的分隔符(","在本例中)拆分您拥有的 ID,然后使用它们从第二个命令中BNAME使用的相关颜色名称。which*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
于 2013-08-13T14:36:55.400 回答
2

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

首先,安装包并加载它:

install.packages("splitstackshape", 
                 repos = "http://cran.cnr.berkeley.edu/", 
                 type = "source")
library(splitstackshape)

拆分您的“B”列,将其重塑为“长”数据集,并merge与您的“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

^^ 我实际上可能会停在那里。与将值粘贴在一起的数据集相比,这将更方便使用。但是,如果您想进行其他步骤,请使用aggregate.

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
于 2013-08-13T17:19:10.650 回答