Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.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
dplyr:将所有列发送到一个组的后面的mutate中的函数_R_Dplyr - Fatal编程技术网

dplyr:将所有列发送到一个组的后面的mutate中的函数

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,我不知道用户需要

在dplyr管道中调用任意函数时,将当前组中的所有列作为TIBLE或data.frame发送到函数的首选方式是什么

在下面的例子中,
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
。它将传递所有未分组的列:)