#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"))