У замены 0 строк, у данных 1400? - PullRequest
       168

У замены 0 строк, у данных 1400?

0 голосов
/ 07 августа 2020

Я проверил другие вопросы и не смог найти решение.

Я пытаюсь обновить вектор в моем фреймворке данных на основе НАБОРА условных выражений, подобных следующему:

EEG3$CorrectFinal <-as.character(EEG3$CorrectFinal)
subjectlist1 = c("s002","s004","s010","s011","s012","s017","s018","s019","s020","s025","s026","s028")
for (i in subjectlist1) {
EEG3$CorrectFinal <- ifelse (EEG3$subject == subjectlist1[i] & EEG3$trial <326 & EEG3$Deviant == 101 & EEG3$Correct == 222|EEG$subject == subjectlist1[i] & EEG3$trial <326 & EEG3$Deviant == 102 & EEG3$Correct == 155|EEG3$subject  == subjectlist1[i] & EEG3$trial >326 & EEG3$Deviant == 101 & EEG3$Correct == 155|EEG$subject == subjectlist1[i] & EEG3$trial >326 & EEG3$Deviant == 102 & EEG3$Correct == 222, yes = 1, no = EEG3$CorrectFinal)}

Но затем я получаю следующее сообщение об ошибке: Error in `$<-.data.frame`(`*tmp*`, "CorrectFinal", value = logical(0)) : replacement has 0 rows, data has 20

Итак, я создал вектор (столбец) нулей во фрейме данных и назначил условные выражения для любого из них, если это правда, заполнить 1, в противном случае сохранить то же значение (то есть 0). Я просто не понимаю, почему я получаю это сообщение об ошибке или где этот сценарий ломается.

Вот код для воспроизведения проблемы с примером фрейма данных:

EEG3 <-read.table(header = TRUE, text ="  subject trial Deviant Correct CorrectFinal
1     s002     1     101     102            0
                    2     s002     2     102     101            0
                    3     s002     3     101     155            0
                    4     s002     4     101     155            0
                    5     s002     5     101     155            0
                    6     s002     6     101     155            0
                    7     s002     7     102     222            0
                    8     s002     8     101     155            0
                    9     s002     9     101     155            0
                    10    s002    10     102     222            0
                    11    s002    11     101     222            1
                    12    s002    12     101     222            1
                    13    s002    13     101     222            1
                    14    s002    14     101     222            1
                    15    s002    15     102     155            1
                    16    s002    16     101     222            1
                    17    s002    17     101     155            0
                    18    s002    18     101     222            1
                    19    s002    19     102     155            1
                    20    s002    20     101     222            1")

> ``` 

1 Ответ

1 голос
/ 07 августа 2020

Ваш пример кода не выдает ошибок на моей консоли, но есть проблема, которая может способствовать возникновению проблем на вашей стороне.

Выполните свой код в 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.

Используйте одну из следующих двух моделей:

  1. for (i in seq_along(subjectlist1)) и оставьте остальную часть кода, так как i теперь будет целым числом; или
  2. 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 делают его немного более читаемым.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...