Многократный цикл для создания списка комбинаций - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался использовать цикл для создания списка комбинаций, но я не получаю все итерации, и он генерирует меньшее число, чем я ожидал.Код, который я использую:

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"

Любая помощь будет отличной!

Спасибо!

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Похоже, вам не хватает индексов в html <- paste(...).Как и у вас, каждая итерация перезаписывает предыдущую html.

Однако, это будет понятнее, если вы создадите data.frame или data.table:

library(data.table)
Base = "http://sigtap.datasus.gov.br/r"
Code = c(304020060, 304050083, 304010308, 304070017, 304010081, 304020184,
          304050040, 304040045, 304010308, 304030074, 304020338, 304020079,
          304040134, 304010081)
Mnth = c(paste0(0, 1:9), 10:12)
Year = c(2015:2018)
Combinations <- data.table(base = rep("http://sigtap.datasus.gov.br", times = 14 * 12 * 4),
                           code = rep(Code, each = 12 * 4),
                           month= rep(Mnth, each = 14 * 4),
                           year = rep(Year, each = 14 * 12))
Combinations[, URL := paste0(base, code, month, year)]

Это личноепредпочтение, но я стараюсь избегать петель, если в этом нет крайней необходимости.Также не рекомендуется использовать одно и то же имя для объектов и базовых функций.Например, month - это функция, которая получает месяц от даты.По этой причине я переименовал base, code, month и year.

0 голосов
/ 22 февраля 2019

Вы можете ускорить ваш код, используя 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

0 голосов
/ 22 февраля 2019

Мне кажется, что вы пытаетесь создать список строк HTML из ваших векторов.Это можно сделать довольно просто.

Из базы мы можем создать матрицу со всеми комбинациями, используя функцию expand.grid

combs <- expand.grid(base, codes, month, year)

, после чего мы можем создать каждую строку с помощью функции applyприменение над первым полем (MARGIN = 1 - это то же самое, что итерация по строкам матрицы).Для каждой строки мы хотим выполнить ту же вставку, что и ваши

html <- apply(combs, 
              MARGIN = 1, 
              FUN = function(x)paste(x, collapse = "/"))

И все готово.По сути, функция apply занимает место цикла.Обратите внимание, что я заменил аргумент sep = "/" вставки аргументом collapse = "/".Это связано с тем, что я вставляю вектор (каждая строка в combs).Таким образом, я разрушаю матрицу, а не удаляю разделение.

0 голосов
/ 22 февраля 2019

Это работает просто отлично, не забывайте сохранять каждую итерацию и не перезаписывать ее.

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)
    html=list()
    iteration=1


  for (i in base) {
    for(j in codes){
      for (k in month) {
        for (l in year) {
          html[[iteration]] <-  paste(i, j, k, l, sep = "/" )
          iteration<-iteration+1

    }}}}

 > length(html)
[1] 672
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...