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

在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

步骤解释

  1. na_if(., "NA"):原始数据里的缺失是字符串"NA",不是R的原生缺失值,先转换为NA方便后续过滤。
  2. pivot_longer:把宽格式的列转为长格式,让每个单词单独占一行,更易处理。
  3. filter(!is.na(word)):移除所有无效的缺失单词。
  4. distinct(word):对每个被试的回忆单词去重,确保同一个单词只计一次分。
  5. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:22