【发布时间】:2020-10-18 16:59:49
【问题描述】:
我无法理解带有 read_csv 函数的 lapply。问题是 Lapply 是否创建了一个数据帧数组,我可以在其中使用 data[i] 访问每个数据帧?
我做了什么:
我已经下载了 5 个城市的数据集(在此处找到:https://archive.ics.uci.edu/ml/machine-learning-databases/00394/FiveCitiePMData.rar)并编写了 R 代码来提取 5 个 csv 文件并保存到数据框中,如下所示:
cities <- list.files('FiveCities')
cities_df <- lapply(cities, read.csv)
我的目标是创建一个工作簿并将每个 csv 文件保存到一个 xlsx 文件中,每个 csv 都是工作簿中的一个工作表,如下所示:
wb <- createWorkbook()
for(i in 1:length(cities)){
sheet <- addWorksheet(wb , i)
writeData(wb, sheet, cities_df[i])
}
我感到困惑的是访问每个 csv 像这样的城市_df[i]。我认为 city_df[i] 访问数据帧的第 i 行,而不是一个单独的数据帧作为一个整体。 lapply 是否会创建一个名为 city_df[i] 的数据框数组,或者会发生什么?如果它确实创建了一个数组,那么我为什么可以简单地调用 city_df 并接收结果而不指定要调用数组中的哪个数据框?
【问题讨论】:
-
试试
cities_df[[i]](双方括号) -
返回的结果似乎和我写的一样
-
但事实并非如此。 Difference between
[and[[ -
lapply返回一个列表。在您的情况下,cities_df是一个包含 5 个元素的列表,其中每个元素都是一个数据框。调用cities_df[[i]]返回第 i 个数据帧,而cities_df[i]返回一个长度为 1 的列表,其中一个元素包含第 i 个 df。您可以通过调用str(cities_df[i])和cities_df[[i]]来验证这一点。 -
[提取子列表,[[提取列表成员。如果该列表成员是 data.frame,那么是的,结果是访问 df。前者永远不会。