мутировать список фреймов с другим списком - PullRequest
1 голос
/ 18 февраля 2020

У меня есть список из 17 фреймов данных и список из 17 дат. Они упорядочены и соответствуют друг другу. Другими словами, list_of_dfs[[1]] соответствует dates[[1]] и так далее. Список дат, приведенный ниже, является объектами даты, использующими lubridate::ymd.

> dates
[1] "2004-10-10" "2005-10-10" "2006-10-10" "2007-10-10" "2008-10-10" "2009-10-10" "2010-10-10" "2011-10-10" "2012-10-10" "2013-10-10" "2014-10-10" "2015-10-10" "2016-10-10" "2017-10-10"
[15] "2018-10-10" "2019-10-10" "2020-10-10"

. Я хотел бы изменить подмножество переменных в каждом кадре данных так, чтобы я вычитал подмножество из соответствующего объекта в * 1007. *. Например, я мог бы сделать следующее для первого элемента:

list_of_dfs[[1]] <- list_of_dfs[[1]] %>% `
  mutate_at(.vars = vars(contains('string')),
            .funs = funs(dates[[1]] - .)

Есть ли способ, которым я включил вышеупомянутое в map или lapply подобную команду, которая позволит мне выполнять итерации по dates?

Моя аппроксимация шкафа будет выглядеть примерно так:

list_of_dfs <- list_of_dfs %>%
      map(., function(x) mutate_at(x,
                               .vars = vars(contains('string')),
                               .funs =  funs(dates - .)))

, которая не может принять объект списка в .funs, как показано выше.

1 Ответ

1 голос
/ 18 февраля 2020

Мы можем использовать map2, так как мы делаем вычитание из соответствующих элементов «дат» list

library(dplyr)
library(purrr)
list_of_dfs2 <- map2(list_of_dfs, dates, ~ {date <- .y
                    .x   %>%
                          mutate_at(vars(contains('string')), ~ date - as.Date(.))})

В версии dplyr для уровня * можно использовать across с mutate

list_of_dfs2 <- map2(list_of_dfs, dates, ~ { date <- .y
                 .x %>%
                    mutate(across(contains('string'), ~ date - as.Date(.x)))
   })

данные

list_of_dfs <- list(data.frame(string1 = Sys.Date() -   1:6, string2 = Sys.Date()), 
          data.frame(string1 = Sys.Date() -   1:6, string2 = Sys.Date()))
dates <- Sys.Date() + 1:2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...