使用map(purrr)将ARUMENTS传递给R自定义函数
使用iris进行再现性使用map(purrr)将ARUMENTS传递给R自定义函数,r,dplyr,tidyverse,R,Dplyr,Tidyverse,使用iris进行再现性 library(tidyverse) mean_by <- function(data,by,var1) { data %>% group_by({{by}}) %>% summarise(avg=mean({{var1}})) } iris %>% mean_by(Species,Petal.Width) # This works map_dfr(iris,mean_by,Species) # This doe
library(tidyverse)
mean_by <- function(data,by,var1) {
data %>%
group_by({{by}}) %>%
summarise(avg=mean({{var1}}))
}
iris %>% mean_by(Species,Petal.Width) # This works
map_dfr(iris,mean_by,Species) # This doesnt work, I want to run this to all numerical columns in iris, how do I do that.
更重要的是,基本问题是:如何使用R中的map_dfr将参数传递给自定义函数理想情况下,您应该跨:
对不起,我正在学习函数&想学习如何在map_-dfr中像上面那样传递参数。我本可以用很多方法做这个简单的练习,但我有兴趣按照要求做。谢谢,2个问题1。为什么当我在函数调用的第一个参数前面添加var1时,答案变成NA。例如:map\u dfrvar1=名称SelectIris,其中是。数值,平均值,数据=iris,by=物种2。为什么我们必须将var1的平均值从{{var1}}改为.data[[var1]]var1部分让我非常困惑,我们是否应该按照函数定义来命名参数,否则函数如何知道哪个参数是哪个参数。不能将参数命名为map\u dfrvar1=。。。。。。。为了减少混淆,请使用map\u dfrnamesselectiris,其中是.numeric、~mean\u byiris、Species、.x2。我们现在将var1作为字符串传递,因此将{{var1}}更改为.data[[var1]]。3.函数知道哪个是哪个,因为我们已经命名data=iris和by=Species,所以剩下的就是var1.map\u dfrnamesselectiris,whereis.numeric,~mean\u bydata=iris,by=Species,var1=.x谢谢,这对我来说非常有意义。
library(dplyr)
library(purrr)
iris %>%
group_by(Species) %>%
summarise(across(where(is.numeric), mean, na.rm = TRUE))
# Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# <fct> <dbl> <dbl> <dbl> <dbl>
#1 setosa 5.01 3.43 1.46 0.246
#2 versicolor 5.94 2.77 4.26 1.33
#3 virginica 6.59 2.97 5.55 2.03
mean_by <- function(data,by,var1) {
data %>%
group_by({{by}}) %>%
summarise(avg = mean(.data[[var1]]))
}
map_dfr(names(select(iris, where(is.numeric))),
mean_by, data = iris, by = Species)
# Species avg
# <fct> <dbl>
# 1 setosa 5.01
# 2 versicolor 5.94
# 3 virginica 6.59
# 4 setosa 3.43
# 5 versicolor 2.77
# 6 virginica 2.97
# 7 setosa 1.46
# 8 versicolor 4.26
# 9 virginica 5.55
#10 setosa 0.246
#11 versicolor 1.33
#12 virginica 2.03