我正在尝试从我下载的几个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
的{{1}}单独阅读,而且我需要插入一个列数据框告诉我数据来自何处,即来自A,B,C或D.
例如,我在循环中插入这些
read.xls
它工作正常,但我不知道在这一步之后该怎么做(或者如果我可以使它更简单)。我接下来要做的就是在循环中将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
将它们组合在一起。
你有什么想法吗?
答案 0 :(得分:2)
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
答案 1 :(得分: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
循环,并且代码非常短且非常简单。