我从4个数据框中收集数据,并希望按行名称合并它们。我正在寻找一种有效的方法来完成这个任务。以下是我拥有的数据的简化版本。
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))
data.frame
添加一个真正的列呢?这样可以节省大部分编码工作。 2.) 即使您保留它们,也可以通过查看merge
参数by.x
和by.y
来节省大量编码。 3.) 使用df$Row.Names <- NULL
可以从data.frame
中删除一列。 4.)Reduce
方法实际上应该有效,我也想知道为什么会失败。 - Beasterfieldall.x = F
和all.y = F
。是否可能保留 df1 的所有行,但排除其他 df 中不在%in% rownames(df1)
中的行,即all.x = T, all.y = F
。 - Hans RoelofsenMyMerge
函数中调整all.x = T,all.y = T
即可。感谢@Paul和@Beasterfield的帮助。 - Hans Roelofsen