【发布时间】: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。