如何为每个受试者在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的部分结果如下:
| x | y | n | Subject |
|---|---|---|---|
| 100 | 240 | 1 | 1 |
| 150 | 450 | 1 | 1 |
| 450 | 624 | 3 | 1 |
| ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者L_ROTOLO
相关产品推荐
相关产品推荐

