[英]Loop through url's with R
我需要从URL下载一系列Excel文件,如下所示:
http://example.com/orResultsED.cfm?MODE=exED&ED=01&EventId=31
http://example.com/orResultsED.cfm?MODE=exED&ED=02&EventId=31
...
http://example.com/orResultsED.cfm?MODE=exED&ED=87&EventId=31
我在循环中有一些构建基块,例如:
for(i in 1:87) {
url <- paste0("http://example.com/orResultsED.cfm?MODE=exED&ED=", i, "&EventId=31")
file <- paste0("Data/myExcel_", i, ".xlsx")
if (!file.exists(file)) download.file(url, file)
}
我的问题 :
seq
放在0之前(我没有运气就尝试了sprintf
) @akrun解决方案效果很好。 但事实证明,并非我所有的Excel文件都具有相同的列数:
map(files, ~read.xlsx(.x,
colNames = FALSE,
sheet = 1,
startRow = 4,
)) %>%
bind_rows
Error in bind_rows_(x, .id) :
Column `X1` can't be converted from numeric to character
我认为此错误实际上指向不相等的列数。 我尝试添加fill = NA
(在测试map_df()
),但没有帮助。
我们可以用sprintf
创建它
paste0("http://example.com/orResultsED.cfm?MODE=exED&ED=", sprintf("%02d", 1), "&EventId=31")
#[1] "http://example.com/orResultsED.cfm?MODE=exED&ED=01&EventId=31"
在循环,
for(i in 1:87) {
i1 <- sprintf('%02d', i)
url <- paste0("http://example.com/orResultsED.cfm?MODE=exED&ED=", i1, "&EventId=31")
file <- paste0("Data/myExcel_", i, ".xlsx")
if (!file.exists(file)) download.file(url, file)
}
假设文件已下载到工作目录中
files <- list.files(full.names = TRUE)
library(openxlsx)
library(purrr)
library(dplyr)
map(files, ~read.xlsx(.x, sheet = 1, startRow = 3)) %>%
bind_rows
或如评论中提到的map_df
可以使用map_df
返回单个数据集
map_df(files, ~read.xlsx(.x, sheet = 1, startRow = 3))
根据OP的评论,某些数据集的列类似乎有所不同。 在这种情况下, bind_rows
会给出错误。 一种选择是使用rbindlist
的data.table
map(files, ~read.xlsx(.x, sheet = 1, startRow = 3)) %>%
data.table::rbindlist(fill = TRUE)
1次循环下载和阅读。 希望如果不使用plyr::rbind.fill
而不是do.call(rbind, list)
类的话,列是对齐的
do.call(rbind, lapply(1:87, function(n) {
url <- paste0("http://example.com/orResultsED.cfm?MODE=exED&ED=",
sprintf("%02d", n), "&EventId=31")
file <- paste0("Data/myExcel_", n, ".xlsx")
if (!file.exists(file)) download.file(url, file)
readxl::read_excel(file, skip=2)
Sys.sleep(5)
}))
您还可以使用regmatches
num=sprintf("%02.0f",1:87)
urls=rep("http://example.com/orResultsED.cfm?MODE=exED&ED=01&EventId=31",87)
`regmatches`(urls,regexpr("\\d+",urls))<-num
urls[87]
[1] "http://example.com/orResultsED.cfm?MODE=exED&ED=87&EventId=31"
要拥有所有文件:
files <- paste0("Data/myExcel_",num , ".xlsx")
下载文件:
mapply(function(x,y)if(!file.exists(x))download.file(y,x),files,urls)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.