【问题标题】:How to build a data frame from several xls files?如何从多个 xls 文件构建数据框?
【发布时间】:2013-04-10 14:00:33
【问题描述】:

我正在尝试从我下载的几个 xls 表中构建一个数据框:

states <- c("A","B","C","D")

for(i in states){
download.file(paste("http://www.web.com/state=",i,".xyz",sep=""),paste("temp",i,".xls",sep=""),mode = "wb")              
    }

效果很好。但我遇到的问题是我想用所有这些 excel 文件构建一个数据框(使用gdata's read.xls 单独阅读这些文件没有问题)并且我需要在数据框上插入一个列告诉我数据来自哪里,即来自 A、B、C 或 D。

例如,我在循环中插入这些

state <- read.xls(paste("temp",i,".xls",sep=""),sheet=1, header = F, skip = 1, perl="C:/Perl/perl/bin/perl.exe",row.names=NULL)
    state$UF <- data.frame(state,paste(i,sep=""))

它工作正常,但我不知道在这一步之后该怎么做(或者我是否可以让它更简单)。我接下来要做的是在循环中将state 重命名为stateA, stateB 等,但我不知道该怎么做。重命名各个数据框后,我会使用rbind 将它们设置在一起。

你有什么想法吗?

【问题讨论】:

    标签: r loops dataframe xls


    【解决方案1】:

    gdata 的read.xls 可以在一次read.xls 呼叫中从互联网上下载和读取文件:

    urls <- sprintf("http://www.web.com/state=%s.xyz", states)
    L <- lapply(urls, read.xls, ...other.read.xls.arguments...)
    names(L) <- states
    

    上面生成了一个数据帧列表L。如果所有数据框的形式相同,则可以将列表组合成一个数据框DF,如下所示:

    DF <- do.call(rbind, L)
    

    DF 的行名将指示每行来自哪个状态。可选地,可以像这样添加一个新列(sub 删除行名的行号部分):

    DF$state <- sub("\\.\\d*$", "", rownames(DF))
    rownames(DF) <- NULL
    

    【讨论】:

      【解决方案2】:

      在 R 中运行良好的一般策略是将你的东西加载到一个列表中:

      state_list = lapply(list.files(pattern = "xls"), read.xls, sheet = 1, etc)
      big_df = do.call("rbind", state_list)
      

      使用plyr 甚至更短:

      library(plyr)
      big_df = ldply(list.files(pattern = "xls"), read.xls, sheet = 1, etc)
      

      请注意这里没有明确的for 循环,并且代码非常简短。

      【讨论】:

      • 嗯,我确实试过了,但我得到一个错误:Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method, : Intermediate file 'C:\Users\temp\fileb00852605506.csv' missing! In addition: Warning message: running command '"C:\Perl\perl\bin\perl.exe" "C:/Users/.../R/win-library/2.15/gdata/perl/xls2csv.pl" "tempCE.xls" "C:\Users\temp\fileb00852605506.csv" "1"' had status 255 Error in file.exists(tfn) : invalid 'file' argument
      • 请创建一个可重现的示例,在我们的计算机上重现您的问题。
      猜你喜欢
      • 2021-12-28
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多