dplyr:将所有列发送到一个组的后面的mutate中的函数
在dplyr管道中调用任意函数时,将当前组中的所有列作为TIBLE或data.frame发送到函数的首选方式是什么 在下面的例子中,dplyr:将所有列发送到一个组的后面的mutate中的函数,r,dplyr,R,Dplyr,在dplyr管道中调用任意函数时,将当前组中的所有列作为TIBLE或data.frame发送到函数的首选方式是什么 在下面的例子中,mean_B是一个简单的例子,在我进行函数调用之前,我知道需要什么mean\u B\u fun给出了错误的答案(与我想要的相比——我想要组内的平均值),而mean\u B\u fun\u ugh给出了我想要的,但这似乎是一种既低效(又丑陋)又能达到我想要的效果的方法 我想对任意列进行操作的原因是,实际上,我在下面的示例中从用户那里获取了my_fun,我不知道用户需要
mean_B
是一个简单的例子,在我进行函数调用之前,我知道需要什么mean\u B\u fun
给出了错误的答案(与我想要的相比——我想要组内的平均值),而mean\u B\u fun\u ugh
给出了我想要的,但这似乎是一种既低效(又丑陋)又能达到我想要的效果的方法
我想对任意列进行操作的原因是,实际上,我在下面的示例中从用户那里获取了my_fun
,我不知道用户需要对哪些列进行操作
library(dplyr)
my_fun <- function(x) mean(x$B)
my_data <-
expand.grid(A=1:3, B=1:2) %>%
mutate(B=A*B) %>%
group_by(A) %>%
mutate(mean_B=mean(B),
mean_B_fun=my_fun(.),
mean_B_fun_ugly=my_fun(as.data.frame(.)[.$A == unique(A),,drop=FALSE]))
库(dplyr)
我的乐趣%
组别(A)%>%
变异(平均值B=平均值B),
mean_B__fun=我的_fun(.),
mean_B_fun_丑陋=我的_fun(as.data.frame(.)[.A==唯一(A),,drop=FALSE]))
这是我的答案,不知道要计算平均值的列
expand.grid(A=1:3, B=1:2) %>%
mutate(B=A*B) %>% nest(-A) %>%
mutate(means = map(.$data, function(x) colMeans(x)))
A data means
1 1 1, 2 1.5
2 2 2, 4 3
3 3 3, 6 4.5
mutate\u all
将按组将函数应用于除分组列以外的所有列。对于my_fun
,参数x
应该是一个向量,函数中的操作应该是mean(x)
,因为mutate将传递给定列中的值向量。tidyverse
中基本上有两种类型的函数:1)将数据帧作为第一个参数的函数(用于管道,如tidyr::separate或dplyr::top_n)和2)采用向量的管道(如stringr
中的所有函数或许多base
函数,如mean
,max
,sum
)-这些通常用于mutate
语句中。有一些可以采用df或vector(如purrr::map
),但行为会有所不同。您的用户函数应该是类型2-它应该采用向量,而不是数据帧。假设用户不在函数内部进行子集,则将使用group_by
。@eipi10用户可能需要将函数应用于多个列以获得其函数的输出。一般来说,写为mean(x$B)
的内容也可以是mean(x$B)+mean(x$A)
,我不知道它们需要哪些列。@dmi3kno,“您的用户函数应该……采用向量,而不是数据帧。”我不能对我的用户进行这种限制。在一个函数调用中,它们可能需要列A
,在下一个函数调用中,它们可能需要列B
,在下一个函数调用中,它们可能需要列A
和B
。更一般地说,我不知道用户数据集中的所有列名,它们对用户意味着什么,以及哪些是重要的;它似乎只传递列B
。它将传递所有未分组的列:)