使用dplyr对分组变量进行总结

使用dplyr对分组变量进行总结,r,dplyr,R,Dplyr,我有一个由3个不同列(a、b和noise)组成的数据帧。 我想对前两列的所有不同的组合以及第三个变量的平均值应用一个函数,并将其保存在一个名为c的新列中。 我的第一个想法是用下面的代码来解决它 library(dplyr) df <- data.frame(a = rep(c(1,2,3),each=9), b = rep(c(1,2,3),length.out=3*9), noise = rnorm(9*3*

我有一个由3个不同列(a、b和noise)组成的数据帧。 我想对前两列的所有不同的组合以及第三个变量的平均值应用一个函数,并将其保存在一个名为c的新列中。 我的第一个想法是用下面的代码来解决它

library(dplyr)

df  <- data.frame(a = rep(c(1,2,3),each=9),
                   b = rep(c(1,2,3),length.out=3*9),
                   noise = rnorm(9*3*1000))

f <- function(a,b,c) a + b + c


result <- df %>% group_by(a,b) %>% summarise(c = f(a,b,mean(noise)))
库(dplyr)
df%汇总(c=f(a[1],b[1],平均值(噪声)))
我的问题是:

  • 为什么dplyr将分组变量保留为向量(这有什么好处?)
  • 使用dplyr有没有更好的方法来解决这个问题

我没有看到您的更新。看起来你已经解决了这个问题。一个可能的修改是
df%>%groupu by(A,b)%>%summary(C=f(first(A),first(b),mean(noise))
df%>%groupu by(A,b)%%>%summary(C=mean(noise))%%>%ungroup()%%mutate(C=Reduce(“+”,)
在发布问题之前,我已经解决了这个问题。我只是觉得奇怪,您必须为分组变量编制索引,并想知道为什么?因为
summary
每个分组变量只返回一行。因此,在不使用索引的情况下,它实际上是用噪声的
平均值
对每组中的每个元素进行
求和,这是一个
变异
步骤。是的,我知道第一段代码将尝试添加长度为3000(a值)的向量和3000(b值)的向量和噪声变量(长度为1的向量)的平均值,这将导致长度为3000的向量,从而产生误差。问题是为什么dplyr会有这种行为,并且看不到变量用于分组,而将其用作数字,或者是否有任何特殊符号来引用分组变量的值?对,你只是在确认我所说的。如果应用了不同的函数,例如
min
,则该函数将起作用,因为
min
始终返回长度为1的向量,而
+
返回与其输入长度相同的向量。从
帮助(“+”)
二进制运算符返回包含逐元素操作结果的向量。如果涉及长度为零的向量,则结果的长度为零。否则,较短向量的元素会根据需要进行回收(当它们只是部分回收时会发出警告)。
我没有看到您的更新。看起来你已经解决了这个问题。一个可能的修改是
df%>%groupu by(A,b)%>%summary(C=f(first(A),first(b),mean(noise))
df%>%groupu by(A,b)%%>%summary(C=mean(noise))%%>%ungroup()%%mutate(C=Reduce(“+”,)
在发布问题之前,我已经解决了这个问题。我只是觉得奇怪,您必须为分组变量编制索引,并想知道为什么?因为
summary
每个分组变量只返回一行。因此,在不使用索引的情况下,它实际上是用噪声的
平均值
对每组中的每个元素进行
求和,这是一个
变异
步骤。是的,我知道第一段代码将尝试添加长度为3000(a值)的向量和3000(b值)的向量和噪声变量(长度为1的向量)的平均值,这将导致长度为3000的向量,从而产生误差。问题是为什么dplyr会有这种行为,并且看不到变量用于分组,而将其用作数字,或者是否有任何特殊符号来引用分组变量的值?对,你只是在确认我所说的。如果应用了不同的函数,例如
min
,则该函数将起作用,因为
min
始终返回长度为1的向量,而
+
返回与其输入长度相同的向量。从
帮助(“+”)
二进制运算符返回包含逐元素操作结果的向量。如果涉及长度为零的向量,则结果的长度为零。否则,较短向量的元素会根据需要进行回收(仅部分回收时会发出警告)。
result <- df %>% group_by(a,b) %>% summarise(c = f(a[1],b[1],mean(noise)))