在R语言中匹配数据框单词至目标词表并计算正确回忆数
解决回忆任务中正确单词计分的问题
我来帮你搞定这个回忆任务的计分需求——咱们需要统计每个被试拼写正确、无重复的回忆单词数量,最终得到包含subject和nCorrect的数据框。下面是两种清晰的实现方法,都能匹配你给出的示例结果:
方法1:使用tidyverse工具包(dplyr + tidyr)
这种方法通过数据格式转换,一步步处理每个单词,逻辑直观易懂:
library(dplyr) library(tidyr) # 加载你的原始数据 df <- data.frame(subject = 1:5, w1 = c("screen", "toad", "toad", "witch", "toad"), w2 = c("package", "tuna", "tuna", "postage", "dinosaur"), w3 = c("tuna", "postage", "toast", "athlete", "ranch"), w4 = c("toad", "witch", "tuna", "package", "NA"), w5 = c("windwo", "mermaid", "NA", "NA", "NA") ) # 正确单词列表 words <- c("screen", "package", "tuna", "toad", "window", "postage", "witch", "mermaid", "toast", "dinosaur") # 核心处理流程 result <- df %>% # 先把字符串形式的"NA"转换成R认可的缺失值NA mutate(across(w1:w5, ~na_if(., "NA"))) %>% # 把宽格式的w1-w5转成每行一个单词的长格式,方便按被试处理 pivot_longer(cols = w1:w5, names_to = "word_col", values_to = "word") %>% # 过滤掉所有缺失的单词 filter(!is.na(word)) %>% # 按被试分组,对每个被试的单词去重 group_by(subject) %>% distinct(word, .keep_all = FALSE) %>% # 统计每个被试的单词中属于正确词表的数量 summarise(nCorrect = sum(word %in% words)) %>% ungroup() # 查看最终结果 print(result)
运行后会得到和你示例完全一致的输出:
# A tibble: 5 × 2 subject nCorrect <int> <int> 1 1 4 2 2 5 3 3 3 4 4 3 5 5 2
步骤解释
na_if(., "NA"):原始数据里的缺失是字符串"NA",不是R的原生缺失值,先转换为NA方便后续过滤。pivot_longer:把宽格式的列转为长格式,让每个单词单独占一行,更易处理。filter(!is.na(word)):移除所有无效的缺失单词。distinct(word):对每个被试的回忆单词去重,确保同一个单词只计一次分。sum(word %in% words):统计每个被试的有效单词中,出现在正确词表里的数量,就是最终得分。
方法2:基础R实现(无需额外包)
如果你习惯用基础R的函数,也可以这样写:
# 加载原始数据 df <- data.frame(subject = 1:5, w1 = c("screen", "toad", "toad", "witch", "toad"), w2 = c("package", "tuna", "tuna", "postage", "dinosaur"), w3 = c("tuna", "postage", "toast", "athlete", "ranch"), w4 = c("toad", "witch", "tuna", "package", "NA"), w5 = c("windwo", "mermaid", "NA", "NA", "NA") ) words <- c("screen", "package", "tuna", "toad", "window", "postage", "witch", "mermaid", "toast", "dinosaur") # 先把字符串"NA"替换为真实的NA df[, paste0("w", 1:5)] <- lapply(df[, paste0("w", 1:5)], function(x) ifelse(x == "NA", NA, x)) # 对每行(每个被试)计算正确数量 nCorrect <- apply(df[, paste0("w", 1:5)], 1, function(row) { valid_words <- na.omit(row) # 去掉缺失值 unique_words <- unique(valid_words) # 去重 sum(unique_words %in% words) # 统计正确单词数 }) # 构建结果数据框 result_baseR <- data.frame(subject = df$subject, nCorrect = nCorrect) print(result_baseR)
这个方法用apply遍历每行数据,逻辑和tidyverse版本一致,最终结果也完全相同。
内容的提问来源于stack exchange,提问作者David Johnson
相关产品推荐
相关产品推荐

