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

按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)

核心思路说明

  1. 批量区间划分:用cut把所有RT1、RT2值一次性映射到对应的网格区间,避免逐个单元格判断的冗余计算
  2. 分组统计:按Subject和区间标签分组,直接统计每组的数量(.N或count)
  3. 格式转换:通过pivot_wider或dcast把长格式的统计结果转成4×4的网格结构,缺失单元格自动填充0,方便查看

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:57