我想转换以下数据框列表
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
谢谢
答案 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
,所有列都以列表中元素的名称为前缀。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