Ваш пример кода не выдает ошибок на моей консоли, но есть проблема, которая может способствовать возникновению проблем на вашей стороне.
Выполните свой код в l oop. Используя mydata
как EEG3
, если вы войдете в свой for
l oop,
for (i in subjectlist1) {
message(sprintf("i='%s', subjectlist1[i]='%s'", i, subjectlist1[i]))
EEG3$CorrectFinal <- ifelse ( ... )
}
, вы сразу увидите, что первое сообщение - i='s002', subjectlist1[i]='NA'
...
Ваш for
l oop перебирает фактические значения, а не индексы вектора subjectlist1
.
Используйте одну из следующих двух моделей:
-
for (i in seq_along(subjectlist1))
и оставьте остальную часть кода, так как i
теперь будет целым числом; или for (i in subjectlist1)
и измените все внутренние subjectlist1[i]
на i
, поскольку i
будет строкой.
Боковое примечание: порядок ваших logi c может быть не тем, что вам нужно. Всякий раз, когда я начинаю вложение &
и |
, я использую скобки, чтобы зафиксировать фактические c logi, которые мне нужны. Например, я предполагаю, что вам нужно что-то вроде:
for (i in subjectlist1) {
EEG3$CorrectFinal <-
ifelse (
EEG3$subject == subjectlist1[i] & (
(EEG3$trial < 326 & EEG3$Deviant == 101 & EEG3$Correct == 222) |
(EEG3$trial < 326 & EEG3$Deviant == 102 & EEG3$Correct == 155) |
(EEG3$trial > 326 & EEG3$Deviant == 101 & EEG3$Correct == 155) |
(EEG3$trial > 326 & EEG3$Deviant == 102 & EEG3$Correct == 222)
), yes = 1, no = EEG3$CorrectFinal)
}
Фактически это можно немного упростить, полностью исключив необходимость в for
l oop.
Сначала ваш код , затем мой:
# this is just to prepopulate the CorrectFinal2 variable to compare your for loop with my code
EEG3$CorrectFinal2 <- EEG3$CorrectFinal
# your code, adjusted
for (i in seq_along(subjectlist1)) {
EEG3$CorrectFinal <-
ifelse (
EEG3$subject == subjectlist1[i] & (
(EEG3$trial < 326 & EEG3$Deviant == 101 & EEG3$Correct == 222) |
(EEG3$trial < 326 & EEG3$Deviant == 102 & EEG3$Correct == 155) |
(EEG3$trial > 326 & EEG3$Deviant == 101 & EEG3$Correct == 155) |
(EEG3$trial > 326 & EEG3$Deviant == 102 & EEG3$Correct == 222)
), yes = 1, no = EEG3$CorrectFinal)
}
ind <- with(EEG3, {
subject %in% subjectlist1 & (
(trial < 326 & Deviant == 101 & Correct == 222) |
(trial < 326 & Deviant == 102 & Correct == 155) |
(trial > 326 & Deviant == 101 & Correct == 155) |
(trial > 326 & Deviant == 102 & Correct == 222))
})
EEG3$CorrectFinal2[ind] <- 1
EEG3
# subject trial Deviant Correct CorrectFinal CorrectFinal2
# 1 s002 1 101 102 0 0
# 2 s002 2 102 101 0 0
# 3 s002 3 101 155 0 0
# 4 s002 4 101 155 0 0
# 5 s002 5 101 155 0 0
# 6 s002 6 101 155 0 0
# 7 s002 7 102 222 0 0
# 8 s002 8 101 155 0 0
# 9 s002 9 101 155 0 0
# 10 s002 10 102 222 0 0
# 11 s002 11 101 222 1 1
# 12 s002 12 101 222 1 1
# 13 s002 13 101 222 1 1
# 14 s002 14 101 222 1 1
# 15 s002 15 102 155 1 1
# 16 s002 16 101 222 1 1
# 17 s002 17 101 155 0 0
# 18 s002 18 101 222 1 1
# 19 s002 19 102 155 1 1
# 20 s002 20 101 222 1 1
(И я утверждаю, что скобки, отступы, сокращение компонентов logi c и отсутствие for
l oop делают его немного более читаемым.)