从R中读取多个Excel文件

4
这是我第一次使用R,所以问题可能很简单。我需要从URL下载xls文件中的数据,每个文件都应该在一个数据框中,就像这里一样。我决定使用gdata包(R版本3.1.0没有可用的“xlsReadWrite”包,win64没有可用的RODBC)。对于一个文件(例如年份=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
  }
}

我原以为在这之后我能够将它们合并,但是不知道如何从列表中的单个数据框中获取数据。 例如 > View(ldata[2]) 只返回第一列。

2个回答

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) 
  )
}

这会返回一个数据框列表,假设它们都是相同的,要合并它们:
ll <- readxls()
do.call(rbind,ll)

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
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接