我有一个来自召回任务的数据框,参与者从他们之前学到的列表中回忆起尽可能多的单词。这是数据的模拟。每行都是一个主题,每列(w1-w5)都是一个被召回的词:
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")
)
产生以下数据框:
subject w1 w2 w3 w4 w5
1 1 screen package tuna toad windwo
2 2 toad tuna postage witch mermaid
3 3 toad tuna toast tuna NA
4 4 witch postage athlete package NA
5 5 toad dinosaur ranch NA NA
我希望将每个产生的单词(列w1 - w5)与正确单词的列表相匹配,这些单词是:
words <- c("screen", "package", "tuna", "toad", "window",
"postage", "witch", "mermaid", "toast", "dinosaur")
我只想为拼写正确且不重复的单词奖励分数。例如,对于上面的数据,我想得到一个如下所示的数据框:
subject nCorrect
1 1 4
2 2 5
3 3 3
4 4 3
5 5 2
主题1会得到4分,因为他们拼错了一个单词。
主题2将得到5分。
主题3将获得3分,因为他们重复金枪鱼并且缺少一个单词。
主题4会得到三分,因为他们有一个不正确的单词和一个遗漏的单词。
主题5会得到两分,因为他们有一个不正确的单词和两个遗失的单词。
答案 0 :(得分:4)
data.frame(subject = df$subject
, nCorrect = apply(df[, -1], 1, function(x) sum(unique(x) %in% words)))
# subject nCorrect
# 1 1 4
# 2 2 5
# 3 3 3
# 4 4 3
# 5 5 2
使用data.table
(相同结果)
setDT(df)
df[, sum(unique(unlist(.SD)) %in% words), by = subject]
答案 1 :(得分:0)
另一种选择是以长格式转换数据。在subject
上分组以使用dplyr::summarise
查找正确数量的匹配答案。
library(tidyverse)
words <- c("screen", "package", "tuna", "toad", "window",
"postage", "witch", "mermaid", "toast", "dinosaur")
df %>% gather(key, value, -subject) %>%
group_by(subject) %>%
summarise(nCorrect = sum(unique(value) %in% words))
# # A tibble: 5 x 2
# subject nCorrect
# <int> <int>
# 1 1 4
# 2 2 5
# 3 3 3
# 4 4 3
# 5 5 2