如何在 R 中按组执行复杂的代数运算?

How to perform complex algebraic operation by group in R?

我的数据框 mydata 如下所示:

city district mean1 mean2 var

alpha A         1     2     0.5
beta  A         3     1     0.2
gamma B         1.5   1     1
zeta  B         2     0     3
...
omega C         1     1     2

我想按组执行一些更复杂的算术来具体化我想计算以下操作:

 sqrt(n(mydata))*((mean(mydata$mean1)-mean(mydata$mean2))/sqrt(mean(mydata$var))

我用 dplyr 尝试过这样的事情:

resutl<-mydata %>%
          group_by(district) %>%
          sqrt(n(mydata))*((mean(mydata$mean1)-mean(mydata$mean2))/sqrt(mean(mydata$var))

然而,上面的方法并没有起作用,因为dplyr 没有将它识别为一个函数。当然,一种解决方案是应用 summarize 函数按组计算所有均值和观察计数,将它们放入新数据框中,然后按行执行上述计算,但是有没有更有效的方法呢?

您可以使用 dplyr's mutate 函数:

library(dplyr)

df %>%
  group_by(district) %>%
  mutate(calculation = n() * (mean(mean1) - mean(mean2))/sqrt(mean(var)))

returns

# A tibble: 5 x 6
# Groups:   district [3]
  city  district mean1 mean2   var calculation
  <chr> <chr>    <dbl> <dbl> <dbl>       <dbl>
1 alpha A          1       2   0.5        1.69
2 beta  A          3       1   0.2        1.69
3 gamma B          1.5     1   1          1.77
4 zeta  B          2       0   3          1.77
5 omega C          1       1   2          0  

注意:我不确定您是需要整个数据集的长度还是只需要子集的长度。在第一种情况下,将 n() 替换为 length(df)

数据

df <- readr::read_table2("city district mean1 mean2 var
alpha A         1     2     0.5
beta  A         3     1     0.2
gamma B         1.5   1     1
zeta  B         2     0     3
omega C         1     1     2")