在R中按ID计算长格式数据框的几何均值问题求助
按分组计算数据框列的几何均值(R语言实现)
dplyr 解决方案
原代码使用的summarise_all在新版dplyr中已被弃用,推荐使用更灵活的summarise(across(...))语法。以下是修正后的代码:
library(dplyr) # 构造示例数据 mtcars_sub <- mtcars[, 1:2] # 按cyl分组,计算所有列的几何均值 mtcars_sub_gm <- mtcars_sub %>% group_by(cyl) %>% summarise(across(everything(), ~ exp(mean(log(.), na.rm = TRUE))))
如果需要指定特定列(比如实际场景中的80+列),可以替换everything()为目标列向量:
# 定义要计算几何均值的列 gm_vars <- names(mtcars_sub)[1] # 实际使用时替换为你的列名向量 mtcars_sub_gm <- mtcars_sub %>% group_by(cyl) %>% summarise(across(all_of(gm_vars), ~ exp(mean(log(.), na.rm = TRUE))))
data.table 解决方案
原代码未将数据转换为data.table对象,导致语法失效。需要先转换为data.table再执行分组计算:
library(data.table) # 将数据框转换为data.table mtcars_sub <- as.data.table(mtcars[, 1:2]) # 指定目标列 gm_vars <- names(mtcars_sub)[1] # 按cyl分组计算几何均值 mtcars_sub_gm <- mtcars_sub[, lapply(.SD, function(x) exp(mean(log(x, na.rm = TRUE)))), by = cyl, .SDcols = gm_vars]
关键注意事项
- 确保计算列的所有值都是正数:log(0)或负数会返回NA/NaN,导致几何均值计算失败,需提前过滤或替换这类值。
na.rm = TRUE会忽略NA值,若需保留NA并让结果为NA,可移除该参数。
内容的提问来源于stack exchange,提问作者ehepikait
相关产品推荐
相关产品推荐

