首页 > 解决方案 > 多重循环创建组合列表

问题描述

我尝试使用循环来创建组合列表,但我没有得到所有的迭代,它产生的数字比我预期的要小。我正在使用的代码:

base = "http://sigtap.datasus.gov.br/r"
    codes = list(304020060, 304050083, 304010308, 304070017, 304010081, 304020184, 304050040, 304040045, 304010308, 304030074, 304020338, 304020079, 304040134, 304010081)      #14 different codes 
    month = c("01", "02", "03", "04","05","06","07","08", "09", "10", "11","12")
    year = c(2015:2018)


  for (i in base) {
    for(j in codes){
      for (k in month) {
        for (l in year) {
          html <-  paste(i, j, k, l, sep = "/" )
    }}}}

我希望获得一条代码、月份和年份记录(大约 670 条不同的记录),但我只得到 14 条:

 [1] "http://sigtap.datasus.gov.br/app/sec/304020060/12/2015"
 [2] "http://sigtap.datasus.gov.br/app/sec/304050083/12/2016"
 [3] "http://sigtap.datasus.gov.br/app/sec/304010308/12/2017"
 [4] "http://sigtap.datasus.gov.br/app/sec/304070017/12/2018"
 [5] "http://sigtap.datasus.gov.br/app/sec/304010081/12/2015"
 [6] "http://sigtap.datasus.gov.br/app/sec/304020184/12/2016"
 [7] "http://sigtap.datasus.gov.br/app/sec/304050040/12/2017"
 [8] "http://sigtap.datasus.gov.br/app/sec/304040045/12/2018"
 [9] "http://sigtap.datasus.gov.br/app/sec/304010308/12/2015"
[10] "http://sigtap.datasus.gov.br/app/sec/304030074/12/2016"
[11] "http://sigtap.datasus.gov.br/app/sec/304020338/12/2017"
[12] "http://sigtap.datasus.gov.br/app/sec/304020079/12/2018"
[13] "http://sigtap.datasus.gov.br/app/sec/304040134/12/2015"
[14] "http://sigtap.datasus.gov.br/app/sec/304010081/12/2016"

任何帮助都会很棒!

谢谢!

标签: rloopscombinations

解决方案


您可以使用do.call

out <- do.call(paste, c(base, expand.grid(codes, month, year), sep = "/"))
head(out)
#[1] "http://sigtap.datasus.gov.br/r/304020060/01/2015"
#[2] "http://sigtap.datasus.gov.br/r/304050083/01/2015"
#[3] "http://sigtap.datasus.gov.br/r/304010308/01/2015"
#[4] "http://sigtap.datasus.gov.br/r/304070017/01/2015"
#[5] "http://sigtap.datasus.gov.br/r/304010081/01/2015"
#[6] "http://sigtap.datasus.gov.br/r/304020184/01/2015"

检查元素的数量

length(out)
#[1] 672

由于base是常数,因此无需将其放入expand.grid


推荐阅读