如何按每20行分组计算mean、sd、min、max等统计指标
问题解决方法
现有代码错误原因
你在by的匿名函数中调用sumtable时传入的是全局数据集df,而非每个分组对应的子集x,导致每次都对全量数据做统计,无法得到分组结果。
修正后的by函数实现
直接将sumtable的入参替换为分组子集即可:
library(vtable) df <- read.csv(...) # 生成分组索引,每20行一组 idx <- ceiling(seq(nrow(df))/20) valuesm <- by(df, idx, function(x){ sumtable(data = x, out = 'return', title = '', summ = c('notNA(x)', 'mean(x)', 'sd(x)', 'min(x)', 'max(x)')) })
运行后valuesm是长度为50的列表,每个元素对应一组的统计结果。如果需要合并为总表,可以追加以下代码:
# 拼接所有分组结果,新增组号列 final_result <- do.call(rbind, lapply(names(valuesm), function(gid) { cbind(group_id = as.integer(gid), valuesm[[gid]]) }))
可选dplyr实现方案
如果习惯用tidyverse语法,也可以用以下代码实现,逻辑更直观:
library(dplyr) df <- read.csv(...) df %>% # 生成分组编号 mutate(group_id = ceiling(row_number() / 20)) %>% group_by(group_id) %>% # 对所有数值列计算指定统计指标,自动忽略非数值列 summarise(across(where(is.numeric), list( notNA = ~sum(!is.na(.)), mean = ~mean(., na.rm = TRUE), sd = ~sd(., na.rm = TRUE), min = ~min(., na.rm = TRUE), max = ~max(., na.rm = TRUE) )))
内容的提问来源于stack exchange,提问作者gahh13 gahh13
相关产品推荐
相关产品推荐

