You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr/data.table计算R中各国哨型的观测均值

问题

我需要对数据执行卡方检验,探究法国(France)与德国(Germany)两类国家间,哨型(A-F)是否存在统计学差异(可参考下方可复现数据框)。

此前我通过dplyr包生成了哨型计数表(如下),现需生成结构完全一致的表格,但将每组的观测计数替换为均值,可使用dplyr或data.table包实现。其中Country与Whistle_Type均为因子类型向量。请教如何计算每个国家下每种哨型的均值?

哨型计数表

library(dplyr)

# 统计每个国家的哨型数量
Count_Whistle.type <- Whistle_Parameters %>% dplyr::count(Whistle_Type, Country, sort=TRUE)

# 各哨型的观测计数
   Whistle_Type Country  n
1             F Germany 38
2             E  France 37
3             B  France 33
4             C Germany 33
5             B Germany 31
6             A  France 27
7             F  France 27
8             A Germany 25
9             D  France 23
10            C  France 21
11            D Germany 21
12            E Germany 19

预期输出示例(均值为模拟值)

Whistle_Type Country  Mean
1             F Germany 14.9
2             E  France 12.4
3             B  France  9.6

可复现R代码

# 模拟数据
# 创建包含2个分组的虚拟列(每组167.5行)
f1 <- gl(n = 2, k=167.5); f1

# 将虚拟列转换为数据框
f2<-as.data.frame(f1)

# 重命名列名
colnames(f2)<-"Country"

# 查看行数
nrow(f2)

# 将Country列的水平重命名为分类标签(设置为因子类型)
levels(f2$Country) <- c("France", "Germany")

# 生成哨型向量
Whistle_Types<-sample(c('A', 'B', 'C', 'D',
                     'E', 'F'), 335, replace=TRUE)

# 生成随机数值
Start.Freq<-runif(335, min=1.195110e+02, max=23306.000000)
End.Freq<-runif(335, min=3.750000e+02, max=65310.000000)
Delta.Time<-runif(335, min=2.192504e-02, max=3.155762)
Low.Freq<-runif(335, min=6.592500e+02, max=20491.803000)
High.Freq<-runif(335, min=2.051000e+03, max=36388.450000)
Peak.Freq<-runif(335, min=7.324220+02, max=35595.703000)
Center.Freq<-runif(335, min=2.190000e-02, max=3.155800)
Delta.Freq<-runif(335, min=1.171875+03, max=30761.719000)
Delta.Time<-runif(335, min=2.192504e-02, max=3.155762)

# 合并列
Bind<-cbind(f2, Start.Freq, End.Freq,  Low.Freq, High.Freq, Peak.Freq,  Center.Freq, Delta.Freq, Delta.Time, Whistle_Types)

# 重命名列
colnames(Bind)<-c('Country', 'Low.Freq', 'High.Freq', 'Start.Freq', 'End.Freq', 'Peak.Freq', 'Center.Freq', 
                  'Delta.Freq', 'Delta.Time',"Whistle_Type")

# 转换为数据框
Whistle_Parameters<-as.data.frame(Bind)
Whistle_Parameters

解决方案

方法一:使用dplyr包

按Country和Whistle_Type分组后,可计算指定数值列或所有数值列的均值,最后按均值降序排序匹配计数表结构:

library(dplyr)

# 计算单一数值列(比如Low.Freq)的均值并排序
Mean_Whistle.type <- Whistle_Parameters %>%
  group_by(Whistle_Type, Country) %>%
  summarise(Mean = mean(Low.Freq), .groups = "drop") %>%
  arrange(desc(Mean))

# 若需计算所有数值列的均值
Mean_Whistle.type_all <- Whistle_Parameters %>%
  group_by(Whistle_Type, Country) %>%
  summarise(across(where(is.numeric), mean), .groups = "drop") %>%
  arrange(desc(Low.Freq)) # 可替换为任意数值列作为排序依据

方法二:使用data.table包

将数据转换为data.table对象后,按分组键计算均值并排序:

library(data.table)

setDT(Whistle_Parameters)

# 计算单一数值列的均值并排序
Mean_Whistle.type_dt <- Whistle_Parameters[, .(Mean = mean(Low.Freq)), by = .(Whistle_Type, Country)] %>%
  setorder(-Mean)

# 若需计算所有数值列的均值
Mean_Whistle.type_dt_all <- Whistle_Parameters[, lapply(.SD, mean), by = .(Whistle_Type, Country), .SDcols = is.numeric] %>%
  setorder(-Low.Freq)

补充说明

  • Country和Whistle_Type的因子类型不影响分组计算,无需额外转换
  • 可根据需求替换代码中的数值列名称(如Low.Freq)为你关注的指标

内容的提问来源于stack exchange,提问作者Alice Hobbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:35:19