【问题标题】:Finding out the percentage of times a sequence in one column is the same as in another column找出一列中的序列与另一列相同的次数百分比
【发布时间】:2017-08-02 16:44:59
【问题描述】:

我希望我能正确地表达这一点。我有一个包含两列的数据集,我试图在内存实验中进行比较。 Recall.CRESP 是一列,指定通过网格坐标选择的内存测试的正确答案。 Recall.RESP 显示参与者的响应。

这些列看起来像这样:

|Recall.CRESP                     | Recall.RESP                     |
|---------------------------------|---------------------------------|                 
|grid35grid51grid12grid43grid54   | grid35grid51grid12grid43grid54  |                
|grid22grid53grid35grid21grid44   | grid23grid53grid35grid21grid43  |
|grid12grid14grid15grid41grid23   | grid12grid24grid31grid41grid25  |
|grid15grid41grid33grid24grid55   | grid15grid41grid33grid14grid55  |          

我有以下代码行告诉我每行列彼此相同的次数百分比:

paste0((100*with(Data, mean(Recall.CRESP==Recall.RESP, na.rm = "TRUE"))), "%")

因此,例如,在我的数据集中,Recall.CRESP 列有 20% 的时间与 Recall.RESP 完全匹配,这表示受试者在 20% 的时间里在他们的记忆测试中得分 5 分(满分 5 分)。

但是,我希望能够通过两种方式对此进行扩展。第一个是在行相同时给我一个百分比,而不是在序列中存在部分匹配时给我一个百分比。例如 grid11gird42gird22grid51grid32grid11gird15gird55grid42grid32 共享 2/5 的匹配,第一个和最后一个网格坐标相同。我不确定如何在 R 中为 2/5 的部分序列匹配(或 5 个中的任何其他结果)指定请求。另请记住,在此示例中,grid42 出现在两个序列中,但考虑到它在Recall.RESP 中的位置不正确,因此无法正确调用。在这些序列中,顺序很重要。

另一点是,到目前为止,我已经根据检查记忆项目前向召回的准确性来描述实验。然而,我也有单独的数据,参与者按倒序回忆。例如,来自Recall.CRESPgrid11gird22gird33grid44grid55 和来自Recall.RESPgrid51grid44grid33grid22grid11 正确匹配4/5 次。如何将代码转过来检查反向序列并计算 5 的百分比?

任何想法将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    我会将字符串分成矩阵列,这样便于比较和操作:

    # borrowing Oriol's nicely shared data
    Recall.CRESP <- c('grid35grid51grid12grid43grid54',
                      'grid22grid53grid35grid21grid44',
                      'grid12grid14grid15grid41grid23',
                      'grid15grid41grid33grid24grid55')
    
    Recall.RESP <- c('grid35grid51grid12grid43grid54',
                     'grid23grid53grid35grid21grid43',
                     'grid12grid24grid31grid41grid25',
                     'grid15grid41grid33grid14grid55')
    
    # function to create matrices
    matrixify = function(dat) {
        dat = do.call(rbind, strsplit(dat, split = "grid"))
        dat = dat[, -1]
        mode(dat) = "numeric"
        return(dat)
    }
    
    cresp_mat = matrixify(Recall.CRESP)
    resp_mat = matrixify(Recall.RESP)
    
    ## an example of what we made: just the numbers in the right order
    cresp_mat
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]   35   51   12   43   54
    # [2,]   22   53   35   21   44
    # [3,]   12   14   15   41   23
    # [4,]   15   41   33   24   55
    
    ## Calculating results is now easy:
    (forwards = rowMeans(cresp_mat == resp_mat))
    # [1] 1.0 0.6 0.4 0.8
    
    (reverse = rowMeans(cresp_mat == resp_mat[, 5:1]))
    # [1] 0.2 0.2 0.0 0.2
    

    当然,您可以将结果分配给原始数据的新列。

    【讨论】:

    • 优秀。谢谢。我可以再问一件事吗?考虑到所有数据,我将如何得出一个总体数字。因此,例如,如果我想问 Recall.CRESP 与 Recall.RESP 匹配的百分比是多少,比如 1/5 匹配?
    • 我不确定我是否理解 - 你是在问有多少行的分数正好是 1/5?
    • 没错,就是这个意思。
    • mean(forwards == 0.2)
    • 完美。你为我节省了很多时间。我将尝试从您的代码中学习以备将来使用。谢谢,一切顺利。
    【解决方案2】:

    这是我的解决方案:

    Recall.CRESP <- c('grid35grid51grid12grid43grid54',
                      'grid22grid53grid35grid21grid44',
                      'grid12grid14grid15grid41grid23',
                      'grid15grid41grid33grid24grid55')
    
    Recall.RESP <- c('grid35grid51grid12grid43grid54',
                     'grid23grid53grid35grid21grid43',
                     'grid12grid24grid31grid41grid25',
                     'grid15grid41grid33grid14grid55')
    
    df <- data.frame(Recall.CRESP, Recall.RESP, stringsAsFactors = F)
    df$correctNormal <- NA
    df$correctReverse <- NA
    
    for (row in 1:nrow(df)) {
      crespVector <- unlist(strsplit(as.character(df[row, 1]), 'grid'))[-1]
      respVector <- unlist(strsplit(as.character(df[row, 2]), 'grid'))[-1]
      correctNormal <- 0
      correctReverse <- 0
      for (i in 1:length(crespVector)) {
        if (crespVector[i] == respVector[i]) correctNormal <- correctNormal + 1
        if (crespVector[i] == respVector[length(respVector) + 1 - i]) correctReverse <- correctReverse + 1
      }
      df$correctNormal[row] = correctNormal / 5
      df$correctReverse[row] = correctReverse / 5
    }
    
    df
    
    ##                     Recall.CRESP                    Recall.RESP correctNormal correctReverse
    ## 1 grid35grid51grid12grid43grid54 grid35grid51grid12grid43grid54           1.0            0.2
    ## 2 grid22grid53grid35grid21grid44 grid23grid53grid35grid21grid43           0.6            0.2
    ## 3 grid12grid14grid15grid41grid23 grid12grid24grid31grid41grid25           0.4            0.0
    ## 4 grid15grid41grid33grid24grid55 grid15grid41grid33grid14grid55           0.8            0.2
    

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2020-07-15
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      相关资源
      最近更新 更多