【发布时间】:2015-02-24 16:20:06
【问题描述】:
我有一个包含 11,383 个数据框的列表。我需要将它们合并到一个大数据框中,但是它们有不同的列(2,3,4 列),所以当我使用 Dplyr 的 rbind_all 时,我得到了不想要的结果。
一种方法是 rbind 具有相同列数的数据帧(具有不同的标题,但我不介意它们)。由于我有 2,3 和 4 列的数据框,根据列表中每个数据框的列数,它将产生 3 个大数据框。
预期输出:
4列数据框:
SKU Tv y Video Tecnología Deportes
2003091070002P Tv y Video Tecnología Deportes
2.00E+12 Tv y Video Tecnología Deportes
2003120060008P Tv y Video Tecnología Deportes
2004121460080P Cómputo Tecnología Decohogar
2.00G+12 Cómputo Tecnología Decohogar
2004121440802P Cómputo Tecnología Decohogar
2.00A+12 Cómputo Tecnología Decohogar
两列数据框:
SKU PROMOCIONES
1 110 2089060010006P PROMOCIONES
2 111 2089660010006P PROMOCIONES
#
这是我的代码:
df_2col <- data.frame() #Starts Data frame for dfs with 2 columns
df_3col <- data.frame() #Starts Data frame for dfs with 3 columns
df_4col <- data.frame() #Starts Data frame for dfs with 4 columns
lapply(my_list, function(i){
if (ncol(i) == 2)
df_2col <- rbind(i)
ifelse (ncol(i) == 3)
df_3col <- rbind(i)
ifelse (ncol(i) == 4)
df_4col <- rbind(i)
})
但我得到这个错误:
Error in ifelse(ncol(i) == 3) : argument "no" is missing, with no default
我的数据列表示例:
list(list(structure(list(SKU = "2079230130006P", Decohogar = "Decohogar",
Para.la.Mesa = "Para.la.Mesa", Copas.y.Vasos = "Copas.y.Vasos"), .Names = c("SKU",
"Decohogar", "Para.la.Mesa", "Copas.y.Vasos"), class = "data.frame", row.names = 134L)),
list(structure(list(SKU = "2079240080001P", Decohogar = "Decohogar",
Para.la.Mesa = "Para.la.Mesa", Copas.y.Vasos = "Copas.y.Vasos"), .Names = c("SKU",
"Decohogar", "Para.la.Mesa", "Copas.y.Vasos"), class = "data.frame", row.names = 132L)),
list(structure(list(SKU = "2069060020005P", PROMOCIONES = "PROMOCIONES"), .Names = c("SKU",
"PROMOCIONES"), class = "data.frame", row.names = 111L)),
list(structure(list(SKU = "2047121452095P", Dormitorio = "Dormitorio",
Colchones = "Colchones", X2.plazas = "X2.plazas"), .Names = c("SKU",
"Dormitorio", "Colchones", "X2.plazas"), class = "data.frame", row.names = 223L)),
list(structure(list(SKU = "2069060010006P", PROMOCIONES = "PROMOCIONES"), .Names = c("SKU",
"PROMOCIONES"), class = "data.frame", row.names = 110L)),
list(structure(list(SKU = "2069060010006P", PROMOCIONES = "PROMOCIONES"), .Names = c("SKU",
"PROMOCIONES"), class = "data.frame", row.names = 109L)))
注意:当您知道列表中每个数据框的列数时,这将起作用。有没有办法做到这一点?我的意思是,如果将来有一个包含 5 列的数据框,则代码还应该为该数据框返回一个包含 5 列的大数据框。
【问题讨论】:
-
它们是否有相交的列名?
-
@akrun,是的,有一个 commun 列:“SKU”,它是每个数据帧中的第一列。我已经放了一些数据,所以你可以看看它是如何的。谢谢。
-
试试
library(data.table);rbindlist(do.call(c, my_list), fill=TRUE) -
或者合并它们?
Reduce(function(...) merge(..., all=T), my_list) -
@akrun,使用 data.table 得到:
Error in rbindlist(do.call(c, my_list), fill = TRUE) : Item 1 of list input is not a data.frame, data.table or list