Как объединить циклы for с 2 переменными?

#r #for-loop

#r #цикл for

Вопрос:

У меня есть несколько циклов for, которые извлекают даты из одного фрейма данных и сопоставляют их с определенными строками / столбцами в другом фрейме данных. Я ищу помощи в преобразовании этого в единую функцию или цикл.

Я пробовал вложенные циклы for, но безуспешно.

Имеющиеся у меня циклы выглядят следующим образом и выполняют то, что мне нужно, чтобы они выполняли:

 for(x in id_vector) {
  datafileslist[[x]]$m3start <- rep(dates_df[[x,3]], nrow(datafileslist[[x]]))
}

for(x in id_vector) {
  datafileslist[[x]]$m3end <- rep(dates_df[[x,4]], nrow(datafileslist[[x]]))
}

for(x in id_vector) {
  datafileslist[[x]]$m6start <- rep(dates_df[[x,5]], nrow(datafileslist[[x]]))
}
  

… и так далее. Хотя это работает, происходит много повторений (у меня 16 циклов for).

Вместо этого я попробовал это:

 for(x in seq_along(id_vector)) {
  for(z in 3:18) {
    for(y in 20:35) {
  datafileslist[[x]][[y]] <- rep(dates_df[[x,z]], nrow(datafileslist[[x]]))
    }
  }
}
  

Но мне нужны совпадающие пары z и y для выполнения один раз в тандеме (3, 20; 4, 21; … 18, 35) через каждый идентификатор, чего не делает приведенный выше код. Есть идеи о том, как я могу это сделать?

dates_df выглядит следующим образом:

 id          m3start           m3end
s01         2016-09-19        2016-12-17
s02         2016-11-03        2017-01-31
  

Существует 60 идентификаторов и 16 комбинаций дат начала / окончания (m3, m6, m9 и т.д.).

Список файлов данных представляет собой список фреймов данных, по одному фрейму данных на идентификатор, с более чем 50 000 наблюдениями около 20 переменных для каждого идентификатора. Я пытаюсь добавить столбцы с датами начала и окончания для каждого диапазона дат из фрейма данных dates_df в фрейм данных для каждого идентификатора.

Результат должен выглядеть примерно так:

 id          group          m3start          m3end          m6start
s01         int            2016-09-19       2016-12-17     2018-09-08
s01         int            2016-09-19       2016-12-17     2018-09-08
s01         int            2016-09-19       2016-12-17     2018-09-08
  

Когда я запускаю вложенные циклы for, я получаю одинаковые даты в m3start, m3end, m6start, m6end и т.д.

 id          group          m3start          m3end          m6start
s01         int            2020-01-12       2020-01-12     2020-01-12
s01         int            2020-01-12       2020-01-12     2020-01-12
s01         int            2020-01-12       2020-01-12     2020-01-12
  

Комментарии:

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

2. Взгляните на mapply , как выполнять параллельный просмотр двух списков.

Ответ №1:

Рассмотрим, merge внутри lapply списка фреймов данных:

 new_datafileslist <- lapply(datafileslist, function(df) merge(df, dates_df, by="id"))