我有一个自定义R函数,可以在测试中为得分创建一个新列 . Recall.CRESP 是一个列,用于指定通过网格坐标选择的测试的正确答案 . Recall.RESP 显示参与者的回复 . 这些列看起来像这样:

|RecallType |Recall.CRESP                     |Recall.RESP                      |
|-----------|---------------------------------|---------------------------------|           
|Forwards   |grid35grid51grid12grid43grid54   |grid35grid51grid12grid43grid54   |                
|Backwards  |grid11gird42gird22grid51grid32   |grid11gird15gird55grid42grid32   |

在第1行中,参与者得到5/5正确,因为Recall.CRESP的网格坐标与Recall.RESP in the correct order 匹配 .

以下功能可以解决这个问题 .

attach(edata)
df <- data_frame(Recall.CRESP, Recall.RESP)

split_grid <- function(x) {
  unlist(regmatches(x, gregexpr("[[:digit:]]+", x)))
}

compare <- function(x, y) {
  sum(split_grid(x) == split_grid(y))
}

df$Res <- mapply(compare, Recall.CRESP, Recall.RESP)
detach(edata)

# A table: 2 x 3
  Recall.CRESP                   Recall.RESP                      Res
  <chr>                          <chr>                          <int>
1 grid35grid51grid12grid43grid54 grid35grid51grid12grid43grid54     5
2 grid11gird42gird22grid51grid32 grid11gird15gird55grid42grid32     2

但是这个功能需要编辑 . 我 table 第二行的答案是不正确的 . 由于 RecallType 在此行中设置为 backwards ,因此当Recall.Resp是Recall.Cresp的相反序列时,我希望该函数能够正确计算得分 . 在这个例子中,正确的答案是1,因为只有网格42匹配(这是Recall CRESP的第二个坐标和Recall RESP向后计数的第二个坐标) .

我希望这是有道理的 . 有什么建议?