[英]merge multiple data.frame by row in R
我想merge
多个data.frame
使用R中row.names
,做了充分的外部联接。 为此,我希望做到以下几点:
x = as.data.frame(t(data.frame(a=10, b=13, c=14)))
y = as.data.frame(t(data.frame(a=1, b=2)))
z = as.data.frame(t(data.frame(a=3, b=4, c=3, d=11)))
res = Reduce(function(a,b) merge(a,b,by="row.names",all=T), list(x,y,z))
Warning message:
In merge.data.frame(a, b, by = "row.names", all = T) :
column name ‘Row.names’ is duplicated in the result
> res
Row.names Row.names V1.x V1.y V1
1 1 a 10 1 NA
2 2 b 13 2 NA
3 3 c 14 NA NA
4 a <NA> NA NA 3
5 b <NA> NA NA 4
6 c <NA> NA NA 3
7 d <NA> NA NA 11
我希望得到的将是:
V1 V2 V3
a 10 1 3
b 13 2 4
c 14 NA 3
d NA NA 11
以下工作(最后一些列重命名):
res <- Reduce(function(a,b){
ans <- merge(a,b,by="row.names",all=T)
row.names(ans) <- ans[,"Row.names"]
ans[,!names(ans) %in% "Row.names"]
}, list(x,y,z))
确实:
> res
V1.x V1.y V1
a 10 1 3
b 13 2 4
c 14 NA 3
d NA NA 11
行连接会发生什么情况是在答案中添加了具有原始rownames的列,而该列又不包含行名称:
> merge(x,y,by="row.names",all=T)
Row.names V1.x V1.y
1 a 10 1
2 b 13 2
3 c 14 NA
此行为记录在?merge
(在Value下)
如果匹配涉及行名称,则在左侧添加一个名为Row.names的额外字符列,并且在所有情况下结果都具有“自动”行名称。
当Reduce
再次尝试合并时,除非手动清除名称,否则它不会找到任何匹配项。
为了保持连续性,这不是一个干净的解决方案,而是一种解决方法,我使用sapply
转换'Reduce'的list参数。
Reduce(function(a,b) merge(a,b,by=0,all=T),
sapply(list(x,y,z),rbind))[,-c(1,2)]
x y.x y.y
1 10 1 3
2 13 2 4
3 14 NA 3
4 NA NA 11
Warning message:
In merge.data.frame(a, b, by = 0, all = T) :
column name ‘Row.names’ is duplicated in the result
出于某种原因,我在Reduce上没有取得多大成功。 给出一个data.frames(df.lst)列表和一个后缀列表(suff.lst)来改变相同列的名称,这是我的解决方案(它的循环,我知道它对于R标准来说很难看,但它有效) :
df.merg <- as.data.frame(df.lst[1])
colnames(df.merg)[-1] <- paste(colnames(df.merg)[-1],suff.lst[[1]],sep="")
for (i in 2:length(df.lst)) {
df.i <- as.data.frame(df.lst[i])
colnames(df.i)[-1] <- paste(colnames(df.i)[-1],suff.lst[[i]],sep="")
df.merg <- merge(df.merg, df.i, by.x="",by.y="", all=T)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.