【问题标题】:Lapply with read_csv使用 read_csv 应用
【发布时间】: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。前者永远不会。

标签: r lapply


【解决方案1】:

这里是创建 Excel 工作簿并将其保存到文件 FiveCities/cities.xlsx 的完整代码。

cities <- list.files('FiveCities', full.names = TRUE)
cities_df <- lapply(cities, read.csv)
names(cities_df) <- sub("\\.csv", "", basename(cities))

wb <- createWorkbook()
for(i in names(cities_df)){
  sheet <- addWorksheet(wb , i)
  writeData(wb, i, cities_df[[i]])
}
saveWorkbook(wb, file = "FiveCities/cities.xlsx")

【讨论】:

    【解决方案2】:

    此代码可能会有所帮助!

    library(plyr)
    library(readr)
    library(tidyverse)
    library(openxlsx)
    mydir = "C:/Users/mouad/Desktop/assasins creed/new"
    myfiles = list.files(path=mydir, pattern="*.csv", full.names=TRUE)
    str_length(mydir)
     
    mylist=lapply(1:5, function(j) read_csv(myfiles[[j]]))
    setwd(mydir)
    wb <- createWorkbook()
    lapply(1:length(mylist), function(i){
      addWorksheet(wb=wb, sheetName = substr(myfiles[i],str_length(mydir)+1,60))
      writeData(wb, sheet = i, mylist[[i]][length(mylist[[i]])])
    })
    saveWorkbook(wb, "test.xlsx", overwrite = TRUE)    
     read.xlsx("test.xlsx", sheet = 1)    
    

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 1970-01-01
      • 2018-08-18
      • 2021-10-05
      • 2018-11-15
      • 2013-04-19
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多