受试者内条件依赖计算: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.
相关产品推荐
相关产品推荐

