在R中高效地使用多个函数
我使用mutate在数据帧中添加新变量。下面的代码是一个示例,在我的实际数据中,我需要将lag1变异为lag100,将lag01变异为lag0100。我不想一个接一个地打这些 有没有一种有效的方法可以做到这一点在R中高效地使用多个函数,r,dplyr,mutate,R,Dplyr,Mutate,我使用mutate在数据帧中添加新变量。下面的代码是一个示例,在我的实际数据中,我需要将lag1变异为lag100,将lag01变异为lag0100。我不想一个接一个地打这些 有没有一种有效的方法可以做到这一点 c <- mtcars %>% mutate_all( .funs = list(lag1 = ~lag(., 1), lag2 = ~lag(., 2),
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样式语法时,会出现范围冲突。因此,我使用了匿名函数。