按Subject分组统计4×4网格各单元格的数据点数量
高效分组统计网格单元格数据量方案
问题背景
现有如下结构的dataframe,需按Subject分组,统计每个受试者的数据点落入指定4×4网格各单元格的数量:
df<-data.frame(Subject = c(rep(1,15), rep(2,15)), RT1=rep(seq(100,1500,100),2), RT2 = rep(seq(200,3000,200),2))
网格的轴划分值为:
x_axis <- c(220, 350, 700, 1250, 1800) y_axis <- c(100, 700, 1400, 2500, 3500)
此前尝试的逐个单元格判断效率极低,table+cut无法实现分组统计,以下提供两种高效可行的方案:
方案一:dplyr + tidyr 实现(适合常规数据量)
利用cut批量划分区间,结合分组计数和宽格式转换,一次性完成统计:
library(dplyr) library(tidyr) # 拼接完整的区间边界(从0开始) x_bins <- c(0, x_axis) y_bins <- c(0, y_axis) df %>% # 按Subject分组 group_by(Subject) %>% # 给RT1、RT2分配对应的区间标签 mutate( RT1_bin = cut(RT1, breaks = x_bins, right = FALSE), RT2_bin = cut(RT2, breaks = y_bins, right = FALSE) ) %>% # 统计每个单元格的数量 count(RT1_bin, RT2_bin, name = "count") %>% # 转成宽格式,缺失单元格填充0 pivot_wider(names_from = RT1_bin, values_from = count, values_fill = 0)
方案二:data.table 实现(适合大数据集)
data.table的分组运算效率更高,适合处理百万级以上的数据集:
library(data.table) # 转成data.table格式 setDT(df) x_bins <- c(0, x_axis) y_bins <- c(0, y_axis) # 分组计数后转宽格式 df[, .(count = .N), by = .(Subject, RT1_bin = cut(RT1, breaks = x_bins, right = FALSE), RT2_bin = cut(RT2, breaks = y_bins, right = FALSE))] %>% dcast(Subject + RT2_bin ~ RT1_bin, value.var = "count", fill = 0)
核心思路说明
- 批量区间划分:用
cut把所有RT1、RT2值一次性映射到对应的网格区间,避免逐个单元格判断的冗余计算 - 分组统计:按
Subject和区间标签分组,直接统计每组的数量(.N或count) - 格式转换:通过
pivot_wider或dcast把长格式的统计结果转成4×4的网格结构,缺失单元格自动填充0,方便查看
内容的提问来源于stack exchange,提问作者L_ROTOLO
相关产品推荐
相关产品推荐

