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

受试者内条件依赖计算:dplyr实现组内差值出错求助

解决受试者内按条件的反应时差值计算问题

你遇到的问题其实是mutate和summarize的用法差异导致的:mutate会保留原始数据的所有行,并将组内计算的结果重复填充到每一行,所以同一个受试者的所有行都会显示相同的差值——这其实是mutate的预期行为,但如果你的目标是每个受试者一行的汇总差值结果,就需要用summarize来替代。

方案一:用summarize生成受试者级别的汇总结果

这个方案会直接输出每个受试者的a.diff和b.diff,每一行对应一个受试者:

library(dplyr)

# 假设你的数据框名为dataset
dataset %>%
  group_by(subject) %>%
  summarize(
    # 计算a_un总和减去a总和,na.rm避免无对应条件时返回NA
    a.diff = sum(target_resp.rt[target_resp == "a_un"], na.rm = TRUE) - sum(target_resp.rt[target_resp == "a"], na.rm = TRUE),
    b.diff = sum(target_resp.rt[target_resp == "b_un"], na.rm = TRUE) - sum(target_resp.rt[target_resp == "b"], na.rm = TRUE)
  )

方案二:先转宽格式再计算(更直观)

如果想更清晰地看到每个条件的总和,再计算差值,可以先把长格式数据转成宽格式:

dataset %>%
  # 先按受试者和目标响应分组,计算每组的总反应时
  group_by(subject, target_resp) %>%
  summarize(total_rt = sum(target_resp.rt, na.rm = TRUE), .groups = "drop") %>%
  # 转成宽格式,每个target_resp作为一列
  pivot_wider(names_from = target_resp, values_from = total_rt, values_fill = 0) %>%
  # 计算差值
  mutate(
    a.diff = a_un - a,
    b.diff = b_un - b
  )

这个方法会先展示每个受试者各条件的总反应时,再给出差值,结果更易读。

为什么你的原始代码会得到重复的差值?

mutate的作用是为原始数据的每一行添加新列,当你在group_by(subject)后用sum()计算组内总和时,这个总和是针对整个受试者的,所以会被复制到该受试者的所有行中——这是正常的,但显然不是你想要的汇总结果。如果确实需要在原始数据中保留所有行,同时附带受试者的差值,那你的原始代码是正确的;但如果要的是每个受试者一行的汇总,就用上面的summarize或转宽格式的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:47