尝试为多个数据帧重复相同的代码

问题描述 投票:1回答:1

我有以下代码,它接受一个名为dft1的数据帧,然后生成一个名为dfb1的结果数据帧。我想为多个输入数据帧重复相同的代码,例如dft1,dft2,所有数据都由一个数字指向最后,然后使用相同的模式存储结果,即dfb1,dfb2,....我尝试了很多方法,比如使用dapply或for循环,但考虑到内部代码的性质,我无法获得预期的结果。


#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)
r loops lapply mutate repeating
1个回答
1
投票

将要应用的命令添加到函数中的每个数据框

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

假设你有输入数据帧,如dft1dft2 ......这将输出一个数据帧列表,你现在可以访问out[['dfb1']]out[['dfb2']]等等。根据您拥有的n数据帧的数量更改dft的值。

如果数据已经存在于列表中,我们可以通过这样做避免使用mget

setNames(lapply(result, apply_fun), paste0("dfb", 1:n))
© www.soinside.com 2019 - 2024. All rights reserved.