我有一个大数据集:
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的情况,然后添加一列
- 从该行中选择的条目(Previous_Choice(
- 该行的结果变量(Previous_output(
- 之前未在该行中选择的号码(即在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
)