Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中高效地使用多个函数_R_Dplyr_Mutate - Fatal编程技术网

在R中高效地使用多个函数

在R中高效地使用多个函数,r,dplyr,mutate,R,Dplyr,Mutate,我使用mutate在数据帧中添加新变量。下面的代码是一个示例,在我的实际数据中,我需要将lag1变异为lag100,将lag01变异为lag0100。我不想一个接一个地打这些 有没有一种有效的方法可以做到这一点 c <- mtcars %>% mutate_all( .funs = list(lag1 = ~lag(., 1), lag2 = ~lag(., 2),

我使用mutate在数据帧中添加新变量。下面的代码是一个示例,在我的实际数据中,我需要将lag1变异为lag100,将lag01变异为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')
                                         ))

任何帮助都将不胜感激

在下面的示例中,我有一个子集mtcars,只保留20行和5列。 代码使用bind_cols/Map应用函数lag和rollmeanr rollmean,align=right


然后是分配新列名的问题。

在下面的示例中,我有一个子集mtcars,只保留20行和5列。 代码使用bind_cols/Map应用函数lag和rollmeanr rollmean,align=right

然后是分配新列名的问题。

您可以在新dplyr 1.0.0中使用Cross对所有列应用多个函数。右对齐的rollmean与使用rollmean相同。您可以使用.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))))
您可以在新的dplyr 1.0.0中使用Cross将多个函数应用于所有列。右对齐的rollmean与使用rollmean相同。您可以使用.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))))

来自zoo Package的rollmean来自zoo PackageHanks@Ronak的rollmean,这是一个很好的方法,但是对于新的变量名没有什么问题。带有…1,…2,…3的新名称后缀只是一个数字序列,无法响应我传递给lag或rollmeanr的数字。是否有方法使新名称后缀为传入的参数。fns etc,mpg_lag1(当使用~lag.,1时)和mpg_mean5(当使用~rollmeanr.,5+1,fill=nab时)再次发送给您。我试图用purrr风格重写代码,但失败了。map_dfc1:x,~mtcars%>%transmuteacross.fns=listlag=~lag.,.x,mean=~rollmeanr.,.x+1,fill=NA,.names=paste0'{col}{fn}',.x。我本想用的。表示mtcars和.x表示1:x但失败。在内部,您可以同时使用两者。和,x的意思是一样的。因此,在本例中使用purrr样式语法时,会出现范围冲突。因此,我使用了匿名函数。谢谢@Ronak,这是一个很好的方法,但是对于新的变量名没有什么问题。带有…1,…2,…3的新名称后缀只是一个数字序列,无法响应我传递给lag或rollmeanr的数字。是否有方法使新名称后缀为传入的参数。fns etc,mpg_lag1(当使用~lag.,1时)和mpg_mean5(当使用~rollmeanr.,5+1,fill=nab时)再次发送给您。我试图用purrr风格重写代码,但失败了。map_dfc1:x,~mtcars%>%transmuteacross.fns=listlag=~lag.,.x,mean=~rollmeanr.,.x+1,fill=NA,.names=paste0'{col}{fn}',.x。我本想用的。表示mtcars和.x表示1:x但失败。在内部,您可以同时使用两者。和,x的意思是一样的。因此,在本例中使用purrr样式语法时,会出现范围冲突。因此,我使用了匿名函数。