【发布时间】:2013-05-16 00:31:27
【问题描述】:
我从 4 个 df 收集数据,并希望按行名合并它们。我正在寻找一种有效的方法来做到这一点。这是我拥有的数据的简化版本。
df1 <- data.frame(N= sample(seq(9, 27, 0.5), 40, replace= T),
P= sample(seq(0.3, 4, 0.1), 40, replace= T),
C= sample(seq(400, 500, 1), 40, replace= T))
df2 <- data.frame(origin= sample(c("A", "B", "C", "D", "E"), 40,
replace= T),
foo1= sample(c(T, F), 40, replace= T),
X= sample(seq(145600, 148300, 100), 40, replace= T),
Y= sample(seq(349800, 398600, 100), 40, replace= T))
df3 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
df4 <- matrix(sample(seq(0, 1, 0.01), 40), 40, 100)
rownames(df1) <- paste("P", sprintf("%02d", c(1:40)), sep= "")
rownames(df2) <- rownames(df1)
rownames(df3) <- rownames(df1)
rownames(df4) <- rownames(df1)
这是我通常会做的:
# merge df1 and df2
dat <- merge(df1, df2, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df3
dat <- merge(dat, df3, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
# merge dat and df4
dat <- merge(dat, df4, by= "row.names", all.x= F, all.y= F) #merge
rownames(dat) <- dat$Row.names #reset rownames
dat$Row.names <- NULL #remove added rownames col
如您所见,这需要大量代码。我的问题是,是否可以通过更简单的方法实现相同的结果。我试过了(没有成功):更新:现在可以了!
MyMerge <- function(x, y){
df <- merge(x, y, by= "row.names", all.x= F, all.y= F)
rownames(df) <- df$Row.names
df$Row.names <- NULL
return(df)
}
dat <- Reduce(MyMerge, list(df1, df2, df3, df4))
提前感谢您的任何建议
【问题讨论】:
-
without success到底是什么意思?请更具体,包括错误。更好的是,创建一个可重现的示例。 -
1.) 如果行名对您的数据结构非常重要,以至于您需要通过这些行名进行合并,为什么不直接将
data.frame用作一个真正的列呢?这为您节省了大部分编码。 2.) 即使保留它们,也可以节省大量编码,请参阅merge参数by.x和by.y3.) 可以使用df$Row.Names <- NULL4.) 从 data.frame 中删除列Reduce方法应该确实有效,我也想知道为什么会失败。 -
我已经包含了一些示例数据。我还发现
的建议方法毕竟确实有效。问题是我想合并 df 中的单个列,从而删除行名信息。 -
但是,在此设置中,仅保留相交的行名
all.x= F和all.y= F。是否可以保留 df1 的所有行,但从其他 df 中排除不是%in% rownames(df1)的行,即all.x= T, all.y= F。 -
好的,Ove 也解决了最后一个问题。只需在“MyMerge”功能中调整
all.x= T, all.y= T。感谢您观看@Paul 和@Basterfield。
标签: r merge dataframe reduce rowname