首页 > 解决方案 > 在 R 中有效地使用多个函数进行变异

问题描述

我使用 mutate 在我的数据框中添加新变量。下面的代码是一个示例,在我的真实数据中,我需要更改lag1lag100lag01to lag0100。我不想一个一个地输入这些。

有没有一种有效的方法来做到这一点?

c <- mtcars %>% mutate_all( .funs = list(lag1 = ~lag(., 1),
                                         lag2 = ~lag(., 2),
                                         lag3 = ~lag(., 3),
                                         lag4 = ~lag(., 4),
                                         lag5 = ~lag(., 5),
                                         lag6 = ~lag(., 6),
                                         lag01 = ~rollmean(., 2, fill = NA, align = 'right'),
                                         lag02 = ~rollmean(., 3, fill = NA, align = 'right'),
                                         lag03 = ~rollmean(., 4, fill = NA, align = 'right'),
                                         lag04 = ~rollmean(., 5, fill = NA, align = 'right'),
                                         lag05 = ~rollmean(., 6, fill = NA, align = 'right'),
                                         lag06 = ~rollmean(., 7, fill = NA, align = 'right')
                                         ))

任何帮助将不胜感激!

标签: rdplyr

解决方案


您可以across在新的dplyr1.0.0 中使用将多个函数应用于所有列。 rollmeanwithalign = 'right与 using 相同rollmeanr.names您可以使用规范分配相关名称。

library(dplyr)
library(purrr)
library(zoo)

x <- 5
map_dfc(1:x, function(i) mtcars %>% 
        transmute(across(.fns = list(lag = ~lag(., i), 
                   mean =  ~rollmeanr(., i + 1, fill = NA)), 
                   .names = paste0('{col}_{fn}_', i))))

推荐阅读