如何从具有不同行大小的列表中创建数据框?

时间:2017-07-22 06:00:23

标签: r

我有这样的数据

df<- list(structure(list(A = c(0.1807, 0.2369, 0.2432, 0.2772, 0.2833, 
    0.3194, 0.407, 0.4507, 0.5023, 0.5064, 0.5183, 0.5414, 0.5527
    ), B = c(0.1139, 0.1417, 0.1028, 0.2472, 0.025, 0.2917, 0.3917, 
    0.4417, 0.4472, 0.4639, 0.5028, 0.5194, 0.5305)), .Names = c("A", 
    "B"), row.names = c(NA, -13L), class = "data.frame"), structure(list(
        A = c(0.1807, 0.2369, 0.2432, 0.2772, 0.2833, 0.3194, 0.407, 
        0.4507, 0.5023), B = c(0.1139, 0.1417, 0.1028, 0.2472, 0.025, 
        0.2917, 0.3917, 0.4417, 0.4472)), .Names = c("A", "B"), row.names = c(NA, 
    -9L), class = "data.frame"), structure(list(A = c(0.1807, 0.2369, 
    0.2432, 0.2772), B = c(0.1139, 0.1417, 0.1028, 0.2472)), .Names = c("A", 
    "B"), row.names = c(NA, -4L), class = "data.frame"))

我希望得到像这样的输出

A         B      A       B        A     B
0.1807  0.1139  0.1807  0.1139  0.1807  0.1139
0.2369  0.1417  0.2369  0.1417  0.2369  0.1417
0.2432  0.1028  0.2432  0.1028  0.2432  0.1028
0.2772  0.2472  0.2772  0.2472  0.2772  0.2472
0.2833  0.025   0.2833  0.025       
0.3194  0.2917  0.3194  0.2917      
0.407   0.3917  0.407   0.3917      
0.4507  0.4417  0.4507  0.4417      
0.5023  0.4472  0.5023  0.4472      
0.5064  0.4639              
0.5183  0.5028              
0.5414  0.5194              
0.5527  0.5305

基本上将每个列表放在另一个列表旁边(虽然它们的大小不同)

3 个答案:

答案 0 :(得分:2)

我们可以使用cbind.fill

中的rowr
library(rowr)
res <- do.call(cbind.fill, c(df, fill=NA))
res
#     A      B      A      B      A      B
#1  0.1807 0.1139 0.1807 0.1139 0.1807 0.1139
#2  0.2369 0.1417 0.2369 0.1417 0.2369 0.1417
#3  0.2432 0.1028 0.2432 0.1028 0.2432 0.1028
#4  0.2772 0.2472 0.2772 0.2472 0.2772 0.2472
#5  0.2833 0.0250 0.2833 0.0250     NA     NA
#6  0.3194 0.2917 0.3194 0.2917     NA     NA
#7  0.4070 0.3917 0.4070 0.3917     NA     NA
#8  0.4507 0.4417 0.4507 0.4417     NA     NA
#9  0.5023 0.4472 0.5023 0.4472     NA     NA
#10 0.5064 0.4639     NA     NA     NA     NA
#11 0.5183 0.5028     NA     NA     NA     NA
#12 0.5414 0.5194     NA     NA     NA     NA
#13 0.5527 0.5305     NA     NA     NA     NA

最好在数据集中使列名称唯一

colnames(res) <- make.unique(colnames(res))

此外,缺失值为NA。如果我们需要"",请将fill=NA更改为fill=""),即

do.call(cbind.fill, c(df, fill=''))

,但这也会将列的class更改为character/factor

答案 1 :(得分:1)

下面的代码会产生看起来非常类似于预期输出的内容:

library(data.table)
cols <- colnames(df[[1L]])
long <- rbindlist(df, idcol = "df.id")
wide <- dcast(long, rowid(df.id) ~ df.id, as.character, value.var = cols, fill = "")[
  , .SD, .SDcols = as.vector(outer(cols, seq_along(df), paste, sep = "_"))]
setnames(wide, rep(cols, length(df)))
wide
         A      B      A      B      A      B
 1: 0.1807 0.1139 0.1807 0.1139 0.1807 0.1139
 2: 0.2369 0.1417 0.2369 0.1417 0.2369 0.1417
 3: 0.2432 0.1028 0.2432 0.1028 0.2432 0.1028
 4: 0.2772 0.2472 0.2772 0.2472 0.2772 0.2472
 5: 0.2833  0.025 0.2833  0.025              
 6: 0.3194 0.2917 0.3194 0.2917              
 7:  0.407 0.3917  0.407 0.3917              
 8: 0.4507 0.4417 0.4507 0.4417              
 9: 0.5023 0.4472 0.5023 0.4472              
10: 0.5064 0.4639                            
11: 0.5183 0.5028                            
12: 0.5414 0.5194                            
13: 0.5527 0.5305

答案 2 :(得分:0)

这是不可能的。 data.frame是一种列表,其中列表的所有元素都作为列粘在一起,并且必须具有相同的长度。更多信息 R dataframe with varied column lengths