我想合并这两个表,但找不到更好的方法。通常,如果我使用合并,则必须至少有一列相互匹配......
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
有没有快速的方法来完成这项工作?
非常感谢!!
LINP
答案 0 :(得分:3)
我分两步完成。首先根据您的分隔符(在本例中为data$B
)分割您在","
中的ID,然后使用这些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
答案 1 :(得分:2)
全新的CRAN是我提供的名为“splitstackshape”的软件包。对于像这样的问题,它可以很方便。
首先,安装软件包并加载它:
install.packages("splitstackshape",
repos = "http://cran.cnr.berkeley.edu/",
type = "source")
library(splitstackshape)
拆分“B”列,将其重塑为“长”数据集,并使用“BNAME”数据集merge
。
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