首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:重新绑定不同数据帧中不同列的data.frames列表

R:重新绑定不同数据帧中不同列的data.frames列表
EN

Stack Overflow用户
提问于 2015-02-24 16:20:06
回答 2查看 2.3K关注 0票数 1

我有11383个数据帧的列表。我需要将它们合并到一个大数据框架中,但是它们有不同的列(2,3,4列),所以当我使用来自Dplyr的rbind_all时,结果并不理想。

一种方法是重新绑定具有相同列数的数据帧(标题不同,但我不介意)。由于我有2,3和4列的数据帧,根据列表中每个数据帧的列数,它将产生3个大数据帧。

预期产出:

有4列的数据帧:

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

有2列的数据帧:

代码语言:javascript
复制
            SKU         PROMOCIONES
1   110 2089060010006P  PROMOCIONES
2   111 2089660010006P  PROMOCIONES

这是我的密码:

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

但我知道这个错误:

代码语言:javascript
复制
Error in ifelse(ncol(i) == 3) : argument "no" is missing, with no default 

我的数据列表示例:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-24 16:46:11

我们可以扁平化列表元素do.call(c,..)获取每个列表元素("indx")的列数(ncol),使用它来对列表进行split,并对结果元素进行rbindlist

代码语言:javascript
复制
library(data.table)
my_list1 <- do.call(`c`, my_list)
indx <- sapply(my_list1, ncol)
lst <- lapply(split(my_list1, indx), rbindlist)
lst
#$`2`
#              SKU PROMOCIONES
#1: 2069060020005P PROMOCIONES
#2: 2069060010006P PROMOCIONES
#3: 2069060010006P PROMOCIONES

#$`4`
#             SKU  Decohogar Para.la.Mesa Copas.y.Vasos
#1: 2089230130006P  Decohogar Para.la.Mesa Copas.y.Vasos
#2: 2089240080001P  Decohogar Para.la.Mesa Copas.y.Vasos
#3: 2047121452095P Dormitorio    Colchones     X2.plazas

如果我们需要获得单独的data.frame对象(不建议使用),请使用list2env

代码语言:javascript
复制
 list2env(setNames(lst, paste0('dat',seq_along(lst))), envir=.GlobalEnv)

更新

如果有空值或NA值作为列表元素之一,我们可以得到这个错误。

代码语言:javascript
复制
my_list1[[7]] <- NA
split(my_list1, sapply(my_list1, ncol))
#Error in split.default(my_list1, sapply(my_list1, ncol)) : 
 #group length is 0 but data length > 0

然后,我们可以检查这些元素是否是data.frame ("isDF")、列表的子集和"ncol",并和以前一样。

代码语言:javascript
复制
isDF <- sapply(my_list1, is.data.frame)
indx <- sapply(my_list1[isDF], ncol)
lapply(split(my_list1[isDF], indx), rbindlist)
票数 2
EN

Stack Overflow用户

发布于 2015-02-24 17:23:36

rbind_all有一个填充函数,它用NA替换空白数据。当我第一次尝试使用rbind时,我得到了一个错误,因为您提供的数据集是一个列表列表,而不是一个数据文件列表。我首先将嵌套的列表转换为dataframes,然后使用rbind创建单个dataframe。

示例数据为"x“。

代码语言:javascript
复制
sapply(x, class)
x2 <- lapply(x, as.data.frame)
x3 <- rbind_all(x2)

我不知道你是否在建立一个整洁的数据框架,但是如果你是的话,你可以用tidyr来帮助

代码语言:javascript
复制
library(tidyr)
x4 <- gather(x3, key=SKU, na.rm=TRUE)[,-2]

更新

这个问题现在已经解决了,但是下面是我对我的解决方案的更新,以便列出单个数据库的数据格式。

代码语言:javascript
复制
x5 <- lapply(unique(x4$value), function(n) filter(x4, value == n))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28700906

复制
相关文章

相似问题

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