首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按行名合并R中2个以上的数据帧

按行名合并R中2个以上的数据帧
EN

Stack Overflow用户
提问于 2013-05-21 17:31:09
回答 4查看 79K关注 0票数 35

我从4个df中收集数据,并希望按行名合并它们。我正在寻找一种有效的方法来做到这一点。这是我拥有的数据的简化版本。

代码语言:javascript
复制
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)

这是我通常会做的:

代码语言:javascript
复制
# 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

如您所见,这需要大量的代码。我的问题是,是否可以用更简单的方法达到同样的结果。我已经尝试过了(没有成功):更新:现在可以工作了!

代码语言:javascript
复制
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))

提前感谢您的任何建议

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-21 22:37:56

三行代码会给出完全相同的结果:

代码语言:javascript
复制
dat2 <- cbind(df1, df2, df3, df4)
colnames(dat2)[-(1:7)] <- paste(paste('V', rep(1:100, 2),sep = ''),
                            rep(c('x', 'y'), each = 100), sep = c('.'))
all.equal(dat,dat2)    

啊,我明白了,现在我明白你为什么这么痛苦了。使用旧的for循环肯定可以做到这一点。也许还有更聪明的解决方案

代码语言:javascript
复制
rn <- rownames(df1)
l <- list(df1, df2, df3, df4)
dat <- l[[1]]
for(i in 2:length(l)) {
  dat <- merge(dat, l[[i]],  by= "row.names", all.x= F, all.y= F) [,-1]
  rownames(dat) <- rn
}
票数 7
EN

Stack Overflow用户

发布于 2013-08-28 17:08:06

来自plyrjoin_all可能会做你想要的事情。但它们必须都是数据框,并且行名作为列添加

代码语言:javascript
复制
require(plyr)

df3 <- data.frame(df3)
df4 <- data.frame(df4)

df1$rn <- rownames(df1)
df2$rn <- rownames(df2)
df3$rn <- rownames(df3)
df4$rn <- rownames(df4)

df <- join_all(list(df1,df2,df3,df4), by = 'rn', type = 'full')

即使行名不同且不匹配,如果您不需要行名,type参数也会有所帮助:

代码语言:javascript
复制
df$rn <- NULL
票数 49
EN

Stack Overflow用户

发布于 2015-11-26 18:02:46

在编辑您的函数时,我想出了一个函数,它允许您通过特定的列键(列名)合并更多的数据帧。得到的数据帧包括合并数据帧的所有变量(如果您只想保留公共变量(不包括NA,请使用:all.x= FALSE, all.y= FALSE)

代码语言:javascript
复制
MyMerge <- function(x, y){
  df <- merge(x, y, by= "name of the common column", all.x= TRUE, all.y= TRUE)
  return(df)
}
new.df <- Reduce(MyMerge, list(df1, df2, df3, df4))
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16666643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档