如何基于被试所见刺激为R DataFrame生成8个正误评分列?
生成记忆测试正确得分列的R实现
问题背景
现有记录记忆测试结果的DataFrame:
list列存储每位被试实际看到的主题- 其余列是被试对各主题/干扰项的判断值(1=标记为见过,0=标记为没见过)
需为每个判断列生成对应得分列:
- 正确(得1):被试见过该主题且判断为1,或没见过该主题且判断为0
- 错误(得0):被试见过该主题但判断为0,或没见过该主题但判断为1
注意:原始代码存在笔误,定义了suicide1、suicide2、memory1、memory2变量,但构建DataFrame时误写为suicide、memory,需先修正。
解决方案代码
1. 修正并加载原始数据
# 原始数据修正笔误后加载 list <- c("suicide memory time","suicide vomit time","vomit alcohol time"," ", " ","alcohol suicide children") id <- c(1:6) suicide1<- c(1,1,0,0,0,1) suicide2<- c(1,1,1,0,0,1) memory1 <- c(1,0,0,1,0,0) memory2 <- c(1,0,0,0,0,0) alcohol<- c(0,1,1,1,1,1) time<- c(1,0,1,1,1,0) foil1<- c(0,0,0,0,0,0) foil2 <- c(0,0,1,0,0,0) # 修正df列名,匹配前面定义的变量 df<- data.frame(list, id, suicide1, suicide2, memory1, memory2, alcohol, time, foil1, foil2)
2. 核心逻辑实现
# 处理list列:将每行主题拆分为干净的字符向量,去除空值和多余空格 df$seen_themes <- lapply(df$list, function(x) { themes <- strsplit(trimws(x), "\\s+")[[1]] if(length(themes) == 0 || themes == "") character(0) else themes }) # 定义计算得分的函数 calculate_score <- function(col_name, df) { # 从列名提取主题(如从suicide1提取suicide) theme <- gsub("\\d+$", "", col_name) # 获取被试的判断值 judgment <- df[[col_name]] # 判断每行被试是否见过该主题 seen <- sapply(df$seen_themes, function(x) theme %in% x) # 计算得分:正确为1,错误为0 as.integer((seen & judgment == 1) | (!seen & judgment == 0)) } # 获取需要生成得分的判断列(排除无关列) judgment_cols <- setdiff(names(df), c("list", "id", "seen_themes")) # 遍历所有判断列,自动生成对应得分列 for(col in judgment_cols) { score_col_name <- paste0(col, "_score") df[[score_col_name]] <- calculate_score(col, df) } # 查看结果(可选) print(df[, c("id", "list", judgment_cols, paste0(judgment_cols, "_score"))])
代码逻辑说明
- 处理
list列:把每个被试的所见主题转换为无空格、无空值的字符向量,方便后续判断 - 得分计算函数:从列名提取对应主题,结合被试是否见过该主题的状态、判断值,按规则生成得分
- 批量生成列:自动遍历所有判断列,无需手动逐个创建得分列,确保效率和准确性
内容的提问来源于stack exchange,提问作者vrad
相关产品推荐
相关产品推荐

