Ale*_*lex 10 merge r dataframe rbind
我有一个data.frame对象列表,我想将它们相互追加,即merge(..., all=T).但是,merge似乎删除了我需要保持原样的行名称.有任何想法吗?例:
x = data.frame(a=1:2, b=2:3, c=3:4, d=4:5, row.names=c("row_1", "another_row1"))
y = data.frame(a=c(10,20), b=c(20,30), c=c(30,40), row.names=c("row_2", "another_row2"))
> merge(x, y, all=T, sort=F)
a b c d
1 1 2 3 4
2 2 3 4 5
3 10 20 30 NA
4 20 30 40 NA
Run Code Online (Sandbox Code Playgroud)
A5C*_*2T1 15
既然你知道你实际上并没有合并,而只是r,,那么这样的事情也许会奏效.它利用了rbind.fill"plyr".要使用它,指定list了的data.frame,你要发rbind.
RBIND <- function(datalist) {
require(plyr)
temp <- rbind.fill(datalist)
rownames(temp) <- unlist(lapply(datalist, row.names))
temp
}
RBIND(list(x, y))
# a b c d
# row_1 1 2 3 4
# another_row1 2 3 4 5
# row_2 10 20 30 NA
# another_row2 20 30 40 NA
Run Code Online (Sandbox Code Playgroud)
Aru*_*run 11
一种方法是row.names在合并中使用,以便将其作为附加列.
> merge(x, y, by=c("row.names", "a","b","c"), all.x=T, all.y=T, sort=F)
# Row.names a b c d
# 1 row_1 1 2 3 4
# 2 another_row1 2 3 4 5
# 3 row_2 10 20 30 NA
# 4 another_row2 20 30 40 NA
Run Code Online (Sandbox Code Playgroud)
编辑:通过查看merge函数getS3method('merge', 'data.frame'),row.names显然设置为NULL(这是一个很长的代码,所以我不会粘贴在这里).
# Commenting
# Lines 63 and 64
row.names(x) <- NULL
row.names(y) <- NULL
# and
# Line 141 (thanks Ananda for pointing out)
attr(res, "row.names") <- .set_row_names(nrow(res))
Run Code Online (Sandbox Code Playgroud)
比方说,创建一个新函数,MERGE就像OP打算这个例子一样.只是一个实验.