将数据框中的单词与R

时间:2018-05-23 19:24:35

标签: r match

我有一个来自召回任务的数据框,参与者从他们之前学到的列表中回忆起尽可能多的单词。这是数据的模拟。每行都是一个主题,每列(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会得到两分,因为他们有一个不正确的单词和两个遗失的单词。

2 个答案:

答案 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