问题描述
我有如下所示的数据框 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")