如何用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
相关产品推荐
相关产品推荐

