Попытка повторить один и тот же код для нескольких фреймов данных - PullRequest
1 голос
/ 27 марта 2019

У меня есть следующий код, который принимает фрейм данных с именем dft1, а затем создает результирующий фрейм данных с именем dfb1. Я хочу повторить один и тот же код для нескольких входных фреймов данных, таких как dft1, dft2, все проиндексированные числом до конца, а затем сохранить результаты, используя один и тот же шаблон, т.е. dfb1, dfb2, .... Я перепробовал много методов, таких как использование dapply или for loop, но, учитывая природу кода внутри, я не смог получить ожидаемые результаты.


#define the function for rolling

window <- 24
rolling_lm <- 
  rollify(.f = function(R_excess, MKT_RF, SMB, HML) {
    lm(R_excess ~ MKT_RF + SMB + HML)
  }, window = window, unlist = FALSE)

#rolling over the variable 

dfb1 <-
  dft1 %>% 
  mutate(rolling_ff = 
           rolling_lm(R_excess, 
                      MKT_RF, 
                      SMB, 
                      HML)) %>% 
  mutate(tidied = map(rolling_ff, 
                      tidy, 
                      conf.int = T)) %>% 
  unnest(tidied) %>% 
  slice(-1:-23) %>% 
  select(date, term, estimate, conf.low, conf.high) %>% 
  filter(term != "(Intercept)") %>% 
  rename(beta = estimate, factor = term) %>% 
  group_by(factor)

1 Ответ

1 голос
/ 27 марта 2019

Добавьте команду, которую вы хотите применить к каждому фрейму данных, в функцию

apply_fun <- function(df) {
   df %>% 
    mutate(rolling_ff = 
         rolling_lm(R_excess, 
                    MKT_RF, 
                    SMB, 
                    HML)) %>% 
    mutate(tidied = map(rolling_ff, 
                    tidy, 
                    conf.int = T)) %>% 
    unnest(tidied) %>% 
    slice(-1:-23) %>% 
    select(date, term, estimate, conf.low, conf.high) %>% 
    filter(term != "(Intercept)") %>% 
    rename(beta = estimate, factor = term) %>% 
    group_by(factor)
}

Теперь примените функцию к каждому фрейму данных и сохраните результаты в списке

n <- 10
out <- setNames(lapply(mget(paste0("dft", 1:n)), apply_fun), paste0("dfb", 1:n))

Предполагая, что выиметь входные фреймы данных, такие как dft1, dft2 ... это выведет список фреймов данных, к которым вы теперь можете обращаться, выполнив out[['dfb1']], out[['dfb2']] и так далее.Измените значение n на основе количества dft имеющихся у вас фреймов данных.

Если данные уже присутствуют в списке, мы можем избежать mget, выполнив

setNames(lapply(result, apply_fun), paste0("dfb", 1:n))
...