【问题标题】:Match words in a data frame to a string in R将数据框中的单词与 R 中的字符串匹配
【发布时间】:2018-05-23 19:24:35
【问题描述】:

我有一个来自回忆任务的数据框,参与者从他们之前学习的列表中回忆尽可能多的单词。这是数据的模型。每一行是一个主题,每一列(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 将获得 3 分,因为他们有一个错误的单词和一个缺失的单词。

主题 5 将获得两分,因为他们有一个错误的单词和两个缺失的单词。

【问题讨论】:

    标签: r match


    【解决方案1】:
    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]
    

    【讨论】:

      【解决方案2】:

      另一种选择是将数据转换为长格式。在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
      

      【讨论】:

        猜你喜欢
        • 2021-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2015-10-14
        • 2018-07-10
        • 1970-01-01
        相关资源
        最近更新 更多