R-根据最近匹配的列查找和更新



我有一个大数据集:

head(data)
subject stim1 stim2 Chosen outcome
1       1     2     1      2       0
2       1     3     2      2       0
3       1     3     1      1       0
4       1     2     3      3       1
5       1     1     3      1       1
6       1     2     1      1       1
tail(data)
subject stim1 stim2 Chosen outcome
44249    3020    40    42     42       0
44250    3020    40    41     41       1
44251    3020    44    45     45       1
44252    3020    41    43     43       0
44253    3020    42    40     42       0
44254    3020    42    44     44       1

我的目标是(在每个受试者中(每行检查最近出现的相同两个刺激1和刺激2的情况,然后添加一列

  1. 从该行中选择的条目(Previous_Choice(
  2. 该行的结果变量(Previous_output(
  3. 之前未在该行中选择的号码(即在Previous_Choice行中(随后在本次审判之前的任何一排中被选中。例如,如果它的stim1=1,stim2=2,Chosen=2,那么我在随后的任何试验中(直到我的当前行(查看Chosen=1(S_choice((例如,请参见第6行(

棘手的部分是,我不在乎哪个数字是stim1,哪些是stim2。For example if my current trial stim1=1 and stim2=2 i want the most recent trial where (stim1=1,stim2=2 OR stim1=2, stim2=1)

预期结果

subject stim1 stim2 Chosen outcome   Previous_Choice  Previous_Outcome  S_choice 
1       1     2     1      2       0         NA                 NA         NA
2       1     3     2      2       0         NA                 NA         NA
3       1     3     1      1       0         NA                 NA         NA
4       1     2     3      3       1          2                 0        FALSE
5       1     1     3      1       1          1                 0        FALSE
6       1     2     1      1       1          2                 0        TRUE

注意——第六行中S_choice为真的原因是在试验1(其中1和2为刺激1和刺激2(之后,在第3行和第5行中选择了1

str(data)
'data.frame':   44254 obs. of  5 variables:
$ subject: num  1 1 1 1 1 1 1 1 1 1 ...
$ stim1  : int  2 3 3 2 1 2 2 3 2 2 ...
$ stim2  : int  1 2 1 3 3 1 3 1 1 1 ...
$ Chosen : int  2 2 1 3 1 1 2 1 2 2 ...
$ outcome: int  0 0 0 1 1 1 1 0 1 0 ...

我不明白S_choise是什么意思,但可能我可以帮助您处理其他2列。

LastOrNa <- function(x) {
if (length(x) == 0) {
return(NA)
}
return(last(x))
}
LastEq <- function(x, y) {
res <- sapply(2:length(x), function(t) {
LastOrNa(which(
(x[1:(t - 1)] == x[t] & y[1:(t - 1)] == y[t]) |
(x[1:(t - 1)] == y[t] & y[1:(t - 1)] == x[t])
))
}
)
return(c(NA, res))
}
data %>% group_by(subject) %>% 
mutate(
last_eq = LastEq(stim1, stim2),
Previous_Choice = Chosen[last_eq],
Previous_Outcome = outcome[last_eq],
last_eq = NULL
)

相关内容

  • 没有找到相关文章

最新更新