如何按Subject和Event分组计算ImmerseNeg与ReframeNeg的Rating差值?
解决方法:按Subject和Event计算Rating差值
下面提供两种常用的实现方式,均能得到你需要的结果:
方法1:使用tidyverse工具包(推荐,代码更直观)
先筛选出仅包含ReframeNeg和ImmerseNeg的行,再通过宽格式转换或分组计算得到差值:
library(dplyr) library(tidyr) # 用于pivot_wider # 方式1:宽格式转换后计算 solution <- example %>% # 过滤掉不需要的ImmerseNeu类型 filter(TrialType %in% c("ReframeNeg", "ImmerseNeg")) %>% # 将TrialType的不同值转为列,对应Rating值 pivot_wider(names_from = TrialType, values_from = Rating) %>% # 计算差值 mutate(NegAffDiff = ImmerseNeg - ReframeNeg) %>% # 保留需要的列 select(Subject, Event, NegAffDiff) # 方式2:分组直接计算 solution <- example %>% filter(TrialType %in% c("ReframeNeg", "ImmerseNeg")) %>% group_by(Subject, Event) %>% summarize( NegAffDiff = Rating[TrialType == "ImmerseNeg"] - Rating[TrialType == "ReframeNeg"], .groups = "drop" # 取消分组 )
方法2:使用Base R(无需额外安装包)
通过筛选、分组聚合的方式实现:
# 先筛选出目标TrialType的行 filtered_data <- example[example$TrialType %in% c("ReframeNeg", "ImmerseNeg"), ] # 按Subject和Event分组计算差值 solution <- do.call(rbind, lapply(split(filtered_data, list(filtered_data$Subject, filtered_data$Event)), function(group) { data.frame( Subject = unique(group$Subject), Event = unique(group$Event), NegAffDiff = group$Rating[group$TrialType == "ImmerseNeg"] - group$Rating[group$TrialType == "ReframeNeg"] ) })) # 清除自动生成的行名 rownames(solution) <- NULL
运行任意一种方法后,solution数据框都会和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

