如何在 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

我想按组执行一些更复杂的算术以针对特定于 mroe 我想计算以下操作:

 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 无法将其识别为函数。当然,一种解决方案是应用汇总函数按组计算所有均值和观察计数,将它们放入新的数据框中,然后按行执行上述计算,但有没有更有效的方法

解决方法

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

library(dplyr)

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

返回

# 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")