【问题标题】:Convert List of data.frames to a single data frame in R将 data.frames 列表转换为 R 中的单个数据框
【发布时间】:2015-03-10 13:18:16
【问题描述】:

我使用 XLConnect 包将一堆电子表格作为数据框列表导入到 R 中:

    sheet_names <- getSheets(wb)
names(sheet_names) <- sheet_names
sheet_list <- lapply(sheet_names, function(.sheet){
  readWorksheet(object=wb, .sheet)})

我现在正在尝试将这些数据框(每个 134 个观测值由 8 个变量)组合成一个数据框,以便我可以进行一些进一步的分析。我发现这行代码让我了解了一些情况:

sh_combined <- do.call("cbind", sheet_list)

但是,这会产生一个 134 obs 乘以 203 个变量的数据框,其中 8 个变量中的每一个都被复制了。理想情况下,我的组合数据框将有一个变量“名称”,它是每个原始数据框的名称 - n.b。在这种情况下,29 个数据框中的每一个都代表对一份由 20 个不同组织回答的问卷的回答。

我不太习惯使用列表,所以想不出一个方便的方法来实现这一点。另一个问题是数据在第一次被捕获时结构很糟糕(格式化为 excel),因此并不完全“整洁”。不过,各个电子表格确实都有一致的行名和列名。

整个列表很大,但结构如下:

List of 29


$ Alliance Youth Group :'data.frame':   134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "192" "8" "20" "5" ...
  ..$ Revenue.Streams: num [1:134] 9600 3600 4800 250 NA NA 900 1000 1200 300 ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Bidii Kweli          :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "300" "0" "12" "5" ...
  ..$ Revenue.Streams: num [1:134] 60000 NA 960 600 NA NA 160 NA 240 NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Bidiika              :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "82" "N/A" "12" "1" ...
  ..$ Revenue.Streams: num [1:134] 4592 NA 1800 400 NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ BigShip              :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "100" "104" "30" "0" ...
  ..$ Revenue.Streams: num [1:134] 30000 31200 9000 NA 3500 NA 2100 17500 17500 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Bokole               :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "50" "N/A" "N/A" "N/A" ...
  ..$ Revenue.Streams: num [1:134] 10000 NA NA NA NA NA NA NA 200 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Brilliant Minds      :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "20" "N/A" "5" "N/A" ...
  ..$ Revenue.Streams: num [1:134] 6000 NA 250 NA NA NA NA NA NA NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Changing Ambassador  :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "300" "4" "0" "0" ...
  ..$ Revenue.Streams: num [1:134] 75000 600 0 0 NA NA NA NA NA NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Chenda Investments   :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "No" "15" "20" "No" ...
  ..$ Revenue.Streams: num [1:134] NA 27000 60000 NA NA NA NA NA NA NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Customer Segments    :'data.frame':  134 obs. of  7 variables:
  ..$ Sector        : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject       : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable      : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA     : chr [1:134] "12" "22" "0" "0" ...
  ..$ Revenue.Strems: num [1:134] 2400 39600 NA NA NA NA 150 NA NA NA ...
  ..$ Cost.Stucture : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes         : chr [1:134] NA "In almost all their apartments they are devided into 6 section/wings where each wing pays KES 300 per month" NA NA ...
 $ Driver Conductor     :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "138" "1" "4" "5" ...
  ..$ Revenue.Streams: num [1:134] 5520 200 200 250 100 NA NA 400 NA NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ District Scouts      :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "150" "No" "15" "20" ...
  ..$ Revenue.Streams: num [1:134] 79950 NA 2400 4800 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Ganjoni Youth        :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "150" "No" "8" "11" ...
  ..$ Revenue.Streams: num [1:134] 4500 NA 240 440 NA NA NA 300 100 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Grandi Youth Bunge   :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "630" "No" "50" "10" ...
  ..$ Revenue.Stream.: num [1:134] 151200 NA 12000 2400 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ King Orani Youth     :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "200" "20" "4" "2" ...
  ..$ Revenue.Streams: num [1:134] 40000 6000 1600 800 NA NA NA NA 400 NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Magongo Santana      :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "10" "8" "6" "N/A" ...
  ..$ Revenue.Streams: num [1:134] 8800 1280 1200 NA NA NA NA NA NA NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Mbuyuni Youth        :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "150" "0" "50" "0" ...
  ..$ Revenue.Streams: num [1:134] 15000 NA 3000 NA NA 800 NA NA NA NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ More Flow Enterprises:'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "No" "409" "6" "No" ...
  ..$ Revenue.Streams: chr [1:134] NA "349,000" NA NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] "Company signs contracts only with landlords/resident agents. Data concerning the value of these contracts is not currently avai"| __truncated__ NA NA NA ...
 $ Mukono Self Help     :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "40" "No" "6" "4" ...
  ..$ Revenue.Streams: num [1:134] 6000 NA 1200 600 NA NA NA 300 400 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Mombasa Youth Network:'data.frame':  134 obs. of  7 variables:
  ..$ Sector        : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject       : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable      : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA     : chr [1:134] "No" "76" "No" "No" ...
  ..$ Revenue.Steams: num [1:134] NA 3800 NA NA NA NA NA NA NA NA ...
  ..$ Cost.Structure: num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes         : chr [1:134] NA NA NA NA ...
 $ OneWorld Youth       :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "50" "No" "15" "10" ...
  ..$ Revenue.Streams: num [1:134] 1000 NA 300 500 NA NA NA 20 NA NA ...
  ..$ Cost.Structures: num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Quatet               :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "12" "22" "0" "0" ...
  ..$ Revenue.Streams: num [1:134] 2400 39600 NA NA NA NA 150 NA NA NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Safi Youth Group     :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "250" "700" "0" "0" ...
  ..$ Revenue.Streams: num [1:134] 25000 140000 NA NA NA NA NA 3500 NA NA ...
  ..$ Cost.Stucture  : chr [1:134] NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Sent Kumi Youth      :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "186" "4" "8" "4" ...
  ..$ Revenue.Streams: num [1:134] 18600 400 1280 480 NA NA NA 160 200 NA ...
  ..$ Cost.structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Smart Guys           :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "100" "No" "No" "2" ...
  ..$ Revenue.Streams: num [1:134] 12000 NA NA 160 NA NA NA NA NA NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Soweto Self Help     :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "100" "N/A" "1" "8" ...
  ..$ Revenue.Streams: num [1:134] 14000 NA 60 640 NA NA NA NA NA NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Stretchers           :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "22" "No" "8" "4" ...
  ..$ Revenue.Streams: num [1:134] 2200 NA 800 200 NA NA NA 200 NA NA ...
  ..$ Cost.Structure.: num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Taka ni Mali         :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "396" "4" "8" "6" ...
  ..$ Revenue.Streams: num [1:134] 59400 4000 1600 2400 0 0 600 300 900 0 ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...
 $ Tuliza               :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "90" "3" "N/A" "2" ...
  ..$ Revenue.Streams: num [1:134] 16200 4500 NA 200 NA NA NA 400 400 NA ...
  ..$ Cost.Stucture  : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] "The 18 households are single bedroom houses and they pay KES 100 per  month while the rest are double bedroom that pay KES 200 "| __truncated__ NA NA NA ...
 $ Zama Uzuke           :'data.frame':  134 obs. of  7 variables:
  ..$ Sector         : chr [1:134] "Customer Segements" NA NA NA ...
  ..$ Subject        : chr [1:134] "Waste Generators" NA NA NA ...
  ..$ Variable       : chr [1:134] "Residential (Household)" "Residential (Apartment)" "Commercial (Dukas)" "Commercial (Bandas)" ...
  ..$ Yes.No.NA      : chr [1:134] "17" "12" "10" "No" ...
  ..$ Revenue.Streams: num [1:134] 4080 2400 2400 NA NA NA NA 1600 1600 NA ...
  ..$ Cost.Structure : num [1:134] NA NA NA NA NA NA NA NA NA NA ...
  ..$ Notes          : chr [1:134] NA NA NA NA ...

我希望我的最终数据框看起来像这样

部门 |主题 |变量 | Yes.No.NA |收入... |成本... |笔记 |姓名*

*其中 name 是一个新变量,表示原始数据框的名称。

注意'Variable' 是这里的关键索引(有 134 个不同的变量)。

真的希望这是有道理的,如果这在其他地方得到了回答,我们深表歉意 - 我确实尝试在 SE 的其他地方找到一些答案。

谢谢

马蒂

【问题讨论】:

  • 你可能想要do.call(rbind, sheet_list),而不是cbind

标签: r list dataframe


【解决方案1】:

你可以先加上名字

sheet_list <- mapply(function(df, name) {
                           df$Name <- rep(name, nrow(df))
                           return(df)
                       }, df = sheet_list, name = names(sheet_list),
                          SIMPLIFY = FALSE)

然后,将所有 data.frames 放入一个单独的

all_df <- do.call("rbind", sheet_list)

另一种选择,你也可以在调用do.call之后添加名字:

all_df <- do.call("rbind", sheet_list)
all_df$Name <- gsub("\\.\\d+$", "", row.names(all_df))

编辑
如果所有 data.frames 的 colname 不同,您可以作为第一步(例如,为所有 data.frames 赋予与第一个 data.frame 相同的 colnames):

sheet_list<-lapply(sheet_list, function(x) {colnames(x) <- colnames(sheet_list[[1]]) ; return(x)})

【讨论】:

  • 感谢您。我感觉我的数据并不像我希望的那样统一,尽管do.call("rbind", sheet_list) 给了我错误Error in match.names(clabs, names(xi)) : names do not match previous names。这是否意味着不同数据帧中的行名不同?
  • @marty_c,很难确切地说出你为什么会出错(我不记得以前有过这个错误),但你可以对你的数据做一些“测试”,例如lapply(sheet_list, function(x){all(colnames(x)==colnames(sheet_list[[1]]))}) .似乎所有 data.frames 都没有相同的 colnames。此外,您可以使用lapply(sheet_list, ncol) 检查列数,以检查所有 data.frames 是否具有相同的列数(最好在检查列名之前进行...)
  • 嗯,我检查了原始数据框中的列名,它们看起来都一样,但是当我尝试lapply(sheet_list, function(x){all(colnames(x)==colnames(sheet_list[[1]]))}) 时,我得到了一半是正确的,一半是错误的。无论如何将所有列名设置为与第一个数据框相同...?
  • @marty_c,是的,您可以在 mapply 调用中添加 colnames 更改,或者在第二个选项中的 do.call 之前执行 lapply。我将编辑我的答案。
【解决方案2】:

这是另一种方式。如果您在一个环境(例如,全局环境)中有所有数据框,您可以使用mget() 获取所有数据框并创建一个列表。然后,您可以在tidyr 包中使用unnest();您可以使用此功能创建一个包含数据框名称的列。我创建了一个简单的示例数据并执行了以下操作。希望这会对你有所帮助。

Alliance <- data.frame(Sector = "Customer Segements",
                       Subject = "Waste Generators",
                       stringsAsFactors = FALSE)


Bidii <- data.frame(Sector = "Customer Segements",
                    Subject = "Waste Generators",
                    stringsAsFactors = FALSE)

# I do not know what kind of patterns you have. You may need to adjust this part.
mylist <- mget(ls(pattern = "^.*"))

# mylist
#$Alliance
#              Sector          Subject
#1 Customer Segements Waste Generators
#
#$Bidii
#              Sector          Subject
#1 Customer Segements Waste Generators

library(tidyr)
unnest(mylist, names)

#     names             Sector          Subject
#1 Alliance Customer Segements Waste Generators
#2    Bidii Customer Segements Waste Generators

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多