1

我正在尝试从我下载的几个 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=""))

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

你有什么想法?

4

2 回答 2

2

gdataread.xls可以一次read.xls调用从 Internet 下载和读取文件:

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
于 2013-04-10T14:37:05.387 回答
1

在 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的循环,并且代码非常简短且切中要害。

于 2013-04-10T14:05:39.587 回答