从R读取许多Excel文件

时间:2014-06-19 10:35:05

标签: r excel

这是我第一次使用R,所以也许这个问题很简单

我需要从url下载xls文件中的日期,每个文件应该在一个数据框中。 像here一样。

我决定使用gdata包(包'xlsReadWrite'不适用于R版本3.1.0,RODBC不适用于win64)

下载适用于一个文件 (例如= 2013年)

readxls<-function()
{
  library("gdata")
  link<-paste0("http://nbp.pl/kursy/archiwum/archiwum_tab_a_",year,".xls")
  xlsdata <<- read.xls(link, sheet = 1, perl = "C:\\Perl64\\bin\\perl.exe", header=TRUE) 
}

我尝试使用循环将许多.xls读入list()。 (例如y_begin = 2012,y_end = 2014)

readxls<-function()
{
  library("gdata")

  ldata<<- list()
  j=1
  for (i in y_begin:y_end)
  {
    link<-paste0("http://nbp.pl/kursy/archiwum/archiwum_tab_a_",i,".xls")
    xlsdata <<- read.xls(link, sheet = 1, perl = "C:\\Perl64\\bin\\perl.exe", header=TRUE) 

    ldata[j] <<- xlsdata
    j<-j+1
  }
}

我认为之后我能够合并它们,但不知道如何从列表中的单个数据帧中获取数据 例如&gt; View(ldata [2])仅返回第一个collumn

2 个答案:

答案 0 :(得分:2)

避免使用for循环,特别是其副作用。最好在这里使用lapply。这是做事的R方式(函数式编程)。我会这样做:

library(gdata)
readxls<-function()
{
  ids <- seq(y_begin,y_end)
  links <-paste0("http://nbp.pl/kursy/archiwum/archiwum_tab_a_",ids,".xls")

  lapply (links,function(i)
     read.xls(link, sheet = 1, perl = "C:\\Perl64\\bin\\perl.exe", header=TRUE) 
  )
}

这将返回data.frame列表,以合并它们,假设它们是相同的:

ll <- readxls()
do.call(rbind,ll)

答案 1 :(得分:0)

非常感谢你,但答案更容易了。它应该制作ldata [[j]]

readxls<-function()
{
  library("gdata")

  ldata<<- list()
  j=1
  for (i in y_begin:y_end)
  {
    link<-paste0("http://nbp.pl/kursy/archiwum/archiwum_tab_a_",i,".xls")
    xlsdata <<- read.xls(link, sheet = 1, perl = "C:\\Perl64\\bin\\perl.exe", header=TRUE) 

    ldata[[j]] <<- xlsdata
    j<-j+1
  }
}