如何使用列表中的rownames将数据框列表转换为大数据框?

时间:2012-03-03 09:39:32

标签: r dataframe

我想转换以下数据框列表

df1<-data.frame(a=1:4,b=5:8)
row.names(df1)<-paste("row",1:4,sep="")
df2<-data.frame(a=9:12,b=13:16)
row.names(df2)<-paste("row",5:8,sep="")
mylist<-list(df1,df2)

mylist

[[1]]
     a b
row1 1 5
row2 2 6
row3 3 7
row4 4 8

[[2]]
      a  b
row5  9 13
row6 10 14
row7 11 15
row8 12 16

到以下数据框

期望的输出

  rnam.df1 a b  rnam.df2 c  d 
1 row1     1 5     row5  9  13
2 row2     2 6     row6  10 14
3 row3     3 7     row7  11 15
4 row4     4 8     row8  12 16

谢谢

4 个答案:

答案 0 :(得分:3)

do.call(cbind, mylist)让你获得99%的胜利。您可能需要稍微修改列名称,具体取决于您的要求有多严格。

答案 1 :(得分:2)

这会返回与您需要的输出非常相似的输出:

mylist2 <- lapply(mylist,FUN=function(x) cbind(rnam=row.names(x), x))
names(mylist2) <- paste('DF',1:length(mylist2),sep='')
d <- as.data.frame(mylist2)
row.names(d) <- 1:nrow(d)

结果:

  DF1.rnam DF1.a DF1.b DF2.rnam DF2.a DF2.b
1     row1     1     5     row5     9    13
2     row2     2     6     row6    10    14
3     row3     3     7     row7    11    15
4     row4     4     8     row8    12    16

说明:

  • 第一行只是添加了一个名为rnam的新列,其中包含 row.names到列表中的每个data.frame。 (并将这个新专栏放在第一位)
  • 第二行将DF1 ... DFn名称添加到列表中的元素
  • 调用as.data.frame(),列表被强制转换为data.frame,所有列都以列表中元素的名称为前缀。
  • 最后,最后一行通过设置行号来删除从列表的第一个data.frame继承的row.names

答案 2 :(得分:0)

请尝试以下代码:

data.frame(cbind(rnam.df1=rownames(df1),a=df1$a),b=df1$b,rnam.df2=rownames(df2),c=df2$a,d=df2$b)

cbind()按列组合这些,返回一个列表 rownames()从数据框中检索所有行名称

然后,使用data.frame返回数据框对象。

答案 3 :(得分:0)

这是另一种解决方案:

n <- length(mylist)
z <- as.data.frame(c(lapply(mylist, rownames), mylist))
colnames(z) <- c(paste("rnam.df", 1:n, sep=""),
                 letters[1:(ncol(z)-n)])
rownames(z) <- NULL
z
#   rnam.df1 rnam.df2 a b  c  d
# 1     row1     row5 1 5  9 13
# 2     row2     row6 2 6 10 14
# 3     row3     row7 3 7 11 15
# 4     row4     row8 4 8 12 16