【问题标题】:R- Reading excel files with loop and creating data framesR-用循环读取excel文件并创建数据框
【发布时间】:2018-09-07 07:27:45
【问题描述】:

我有一堆文件(数量不断增长), 每个文件都应该有一个单独的数据框。

为了简化阅读,我想使用循环来阅读所有文件。 新数据框应以“文件名”中的字符串命名

在最后一行我想创建一个数据框,新数据框的名称应该是“文件名”的内容。

for(x in 1:nrow(Namen)) # creation of the loop

{

  Filename<- Namen[x,1] #Takes the Filename from the the DF

  einlesepfad <- "path for reading the xlsm files" 
   einlesepfad <- paste(einlesepfad,Filename,".xlsm", sep="") # creation of the path to read the xlsm file
   Filename <- read_excel(einlesepfad) #The Content of "Filename" should be the Name of the new data frame
}

【问题讨论】:

  • 请澄清您的问题。看看here 如何创建一个最小的工作示例。

标签: r loops dataframe


【解决方案1】:

如果我理解正确,您想将列表中的许多文件读入单个数据帧吗?我提供了一个稍微不同的解决方案:

results <- list()
for(x in 1:nrow(Namen)) # creation of the loop
{
  Filename<- Namen[x,1] #Takes the Filename from the the DF

  einlesepfad <- "path for reading the xlsm files" 
  einlesepfad <- paste(einlesepfad,Filename,".xlsm", sep="") # creation of the path to read the xlsm file
  results[Filename] <- read_excel(einlesepfad) # The list gets a new item, named whatever value Filename had, that contains your data
}

这样,您的每个文件都在一个单独的数据框中,所有数据框都在一个列表中 - results。要从文件 "datafile1.xlsm" 访问数据框,请执行以下操作:

results['datafile1']

甚至

results$datafile1

您之前尝试做的是为每个数据框提供一个单独的变量 - 可能(我认为您可以使用paste 然后eval 构造语句),但是数据框列表几乎总是一个更好的主意。

【讨论】:

  • 我有一堆文件(数量不断增长),每个文件都应该有一个单独的数据框。为了简化阅读,我想使用循环来读取所有文件。新数据框应以“文件名”中的字符串命名
【解决方案2】:

使用您的包和示例,您可以执行以下操作:

在列表中传递文件名:

Namen <- list(c('fname1', 'fname2') # your names list (i am guessing without .xlsx)
einlesepfad <- "path for reading the xlsm files"

将每个文件推入一个数据框

df.list <- list() #empty data frame list
df.list= lapply(Namen, function(i){
  fname <- paste0(einlesepfad, i, '.xlsm') # get the full filename
  x = read_excel(fname) # read the excel file in
  # Edit: Removed the name column part
  # Return your data
  return (x)
})

编辑:
刚刚看到您对元素命名列表请求的编辑。这是添加名称的非常​​快速(非优雅)的解决方案:

names(df.list) <- lapply(Namen, function(x){x})

然后,您可以通过以下任一方式访问列表中的每个数据框 df.list['name'] 或索引df.list[1]

编辑2:
另外,由于我注意到您说您的文件名列表不断增长,只要您将所有文件存储在同一个目录中,您可以执行以下操作:

Namen <– list.files(einlesepfad, '*.xlsm') 

只记得更改函数内的 fname 并删除 '.xlsm' 部分:

fname <- paste0(einlesepfad, i)

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2020-05-24
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多