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

如何为每个受试者在R的cut()函数中使用不同分箱值?

解决方案

要实现每个受试者使用专属分箱值进行频次统计,可以利用dplyr的group_map函数对每个受试者分组单独处理,步骤如下:

1. 准备示例数据

先确认输入数据(和你提供的一致):

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

df2 <- data.frame(
  Subject = c(1,2),
  B1 = c(100,110),
  B2 = c(150,168),
  B3 = c(450,624),
  B4 = c(960,1278)
)

df3 <- data.frame(
  Subject = c(1,2),
  B1 = c(240,246),
  B2 = c(450,378),
  B3 = c(624,670),
  B4 = c(1145,1681)
)

2. 分组处理分箱与统计

使用group_map遍历每个受试者分组,为每组提取对应的分箱值,执行cut分箱后统计频次:

library(dplyr)

result <- df %>%
  group_by(Subject) %>%
  group_map(function(.x, .y) {
    # 获取当前受试者ID
    subj_id <- .y$Subject
    
    # 提取当前受试者的RT1分箱断点与标签
    rt1_breaks <- c(0, df2[df2$Subject == subj_id, -1], Inf)
    rt1_labels <- c(as.character(df2[df2$Subject == subj_id, -1]), ">max")
    
    # 提取当前受试者的RT2分箱断点与标签
    rt2_breaks <- c(0, df3[df3$Subject == subj_id, -1], Inf)
    rt2_labels <- c(as.character(df3[df3$Subject == subj_id, -1]), ">max")
    
    # 对当前组数据分箱并统计频次
    .x %>%
      mutate(
        x = cut(RT1, breaks = rt1_breaks, labels = rt1_labels, include.lowest = TRUE),
        y = cut(RT2, breaks = rt2_breaks, labels = rt2_labels, include.lowest = TRUE)
      ) %>%
      count(x, y, .drop = FALSE) %>%
      mutate(Subject = subj_id)
  }) %>%
  bind_rows()

代码说明

  • group_map:按Subject分组后,对每组数据单独执行自定义函数,.x是当前组的数据集,.y是分组的键信息(即受试者ID)。
  • 分箱构造:为每个受试者从df2和df3中提取专属的B1-B4分箱值,拼接0和Inf形成完整的断点序列;标签用分箱值加上>max表示超出最大分箱的区间。
  • include.lowest = TRUE:确保等于最小断点(比如RT1=100)的数值被包含在第一个区间内,避免数据遗漏。
  • count(x, y, .drop = FALSE):保留所有可能的x-y组合(包括频次为0的单元格),确保结果是完整的网格统计。

结果示例

运行后result会包含每个受试者的所有网格单元格频次,比如受试者1的部分结果如下:

xynSubject
10024011
15045011
45062431
............

内容的提问来源于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.10 04:56:01