在R中使用具有不同长度的多个变量的sprintf

时间:2014-07-24 15:49:52

标签: r printf

我正在使用R试图使用sprintf函数打印多个网址。该网址采用http://www.weather.unh.edu/data/year/day.txt格式。我想打印多年的每一天的网址。我试过了:

day <-c(1:365) year <-c(2001:2004) urls<- sprintf("http://www.weather.unh.edu/data/%s/%s.txt", year, day)

但收到错误

Error in sprintf("http://www.weather.unh.edu/data/%s/%s.txt", year, day) : arguments cannot be recycled to the same length

我正在打印这些网址,以便我可以批量导入这些网址中的原始数据。  如果有人知道如何使用sprintf或其他功能,请告诉我

3 个答案:

答案 0 :(得分:0)

您可以使用for循环:

days <- c(1:365)
years <- c(2001:2004)
urls <- c()

for (year in years) {
  for (day in days) {
    urls <- c(urls, sprintf("http://www.weather.unh.edu/data/%s/%s.txt", year, day))
  }
}

答案 1 :(得分:0)

你跑进了墙,因为它无法回收你给它的值。 (365/4不是一个整数)。

只需从两个中输入一个字符串,然后使用sprintf

day  <- c(1:365)
year <- c(2001:2004)
day.year <- paste(rep(year,each = 365),day,sep = '/')
sprintf('http://www.weather.unh.edu/data/%s.txt',day.year)

干杯。

答案 2 :(得分:0)

您想要的是expand.grid生成年和日的组合。

times <- expand.grid(days=1:365, years=2001:2004)
urls <- sprintf("http://www.weather.unh.edu/data/%s/%s.txt", times$year, times$days)
head(urls)
[1] "http://www.weather.unh.edu/data/2001/1.txt"
[2] "http://www.weather.unh.edu/data/2001/2.txt"
[3] "http://www.weather.unh.edu/data/2001/3.txt"
[4] "http://www.weather.unh.edu/data/2001/4.txt"
[5] "http://www.weather.unh.edu/data/2001/5.txt"
[6] "http://www.weather.unh.edu/data/2001/6.txt"

那说,这会遇到闰年等问题;你可能想要考虑seq.Date,比如

dates <- as.POSIXlt(seq.Date(as.Date("2010-01-01"), as.Date("2014-12-31"), by="day"))

然后

urls <- sprintf(".../%s/%s", dates$year + 1900, dates$yday)