2014-12-19 2 views
-2

Я новичок в R. Я пытаюсь присвоить некоторые значения столбцу на основе инструкции if else. Но он все время бросает мне ошибку. Может ли кто-нибудь помочь мне понять, для чего нужна ошибка?Оператор IF else выдает ошибку в R

Код:

if (REAR[mean < (-2) & mean > 2,]) { 
    REAR$EXCEPTION_1<-1; REAR$EXCEPTION_2<-0 
} else if(REAR[!(mean < (-2) & mean > 2) & deviation > 1.5,]) { 
    REAR$EXCEPTION_1<-0; REAR$EXCEPTION_2<-1 
} else { 
    REAR$EXCEPTION_1<-0; REAR$EXCEPTION_2<-0 
} 


Error: 
Error: 
Error in mean < (-5) : 
    comparison (3) is possible only for atomic and list types 

Образец данных:

dput(head(REAR)) 

structure(list(TIMESTAMP = structure(list(c(0, 0, 0, 
0, 0, 0), c(45L, 0L, 15L, 30L, 45L, 0L), c(17L, 18L, 18L, 18L, 
18L, 19L), c(5L, 5L, 5L, 5L, 5L, 5L), c(7L, 7L, 7L, 7L, 7L, 7L 
), c(114L, 114L, 114L, 114L, 114L, 114L), c(2L, 2L, 2L, 2L, 2L, 
2L), c(216L, 216L, 216L, 216L, 216L, 216L), c(0L, 0L, 0L, 0L, 
0L, 0L), c("IST", "IST", "IST", "IST", "IST", "IST"), c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
)), class = c("POSIXlt", "POSIXt")), ID = c(28808, 28808, 
28808, 28808, 28808, 28808), CONNECTION= c("UP", "UP", 
"UP", "UP", "UP", "UP"), ACTIVE = c(68.814, 68.814, 
68.814, 68.814, 68.814, 68.814), SET = c(70, 
70, 70, 70, 70, 70), MODE = c("Cool", "Cool", "Cool", 
"Cool", "Cool", "Cool"), STATUS = c("Occupied", "Occupied", 
"Occupied", "Occupied", "Occupied", "Occupied"), KNOB= c("On", 
"On", "On", "On", "On", "On"), loopN = c(140805L, 140805L, 140805L, 
140805L, 140805L, 140805L), timediff = c(15, 15, 15, 15, 15, 
15), diff= c(-1.18600000000001, -1.18600000000001, 
-1.18600000000001, -1.18600000000001, -1.18600000000001, -1.18600000000001 
), mean = c(-1.67920000000001, -1.67920000000001, -1.67920000000001, 
-1.67920000000001, -1.67920000000001, -1.67920000000001), deviation= c(0.553944943112579, 
0.553944943112579, 0.553944943112579, 0.553944943112579, 0.553944943112579, 
0.553944943112579), EXCEPTION_1 = c(0, 0, 0, 0, 0, 
0), EXCEPTION_2 = c(0, 0, 0, 0, 0, 0)), .Names = c("TIMESTAMP", 
"ID", "CONNECTION", "ACTIVE ", "SET", 
"MODE", "STATUS", "KNOB", 
"loopN", "timediff", "diff", "mean", "deviation", 
"EXCEPTION_1", "EXCEPTION_2"), row.names = 764:769, class = "data.frame") 
+0

Выход 'dput' также выдает предупреждающее сообщение' Предупреждающее сообщение: In is.na (secs): is.na() применяется к не (списку или вектору) типа 'NULL'' – akrun

+0

Вы должны обратитесь к столбцу «mean» по-другому, например, с помощью «REAR $ mean» –

+0

@ Kaushal. Рассмотрим использование 'ifelse' – akrun

ответ

2

Ваша ошибка исходит от недееспособности «[» функция «знает», что вы собираетесь использовать «среднее», как имя столбца. Единственный mean, который он может найти, является функцией mean и пытается сравнить с числовым, выдает конкретную ошибку, которую вы получили. (Обычно неверно использовать столбцы с токенами, которые также являются именами для общих функций, но это не является причиной ошибки.Если бы существовала переменная с именем mean, интерпретатор использовал бы ее значение. Имена столбцов не являются «видимыми», для операторов, если не подвергать их помощью with или с помощью [[name]] или других сложных устройств, таких как eval или substitute, которые позволяют спецификации в «среде оценки»)

Alternate (но, вероятно, не аа успешного):

if (with(REAR , mean < (-2) & mean > 2)) { 
    REAR$EXCEPTION_1<-1; REAR$EXCEPTION_2<-0 
    } else { if(with(REAR, !(mean < (-2) & mean > 2) & 
           standardeviation > 1.5) 
      ) { REAR$EXCEPTION_1<-0; REAR$EXCEPTION_2<-1 
       } else { REAR$EXCEPTION_1<-0; SAT$EXCEPTION_2<-0 
              } 
      } 

Но было указано, что это не решает дальнейших трудностей, предполагая, что R i s SAS (или SPSS). В R нет неявного цикла по векторам столбцов при использовании конструкции if(.){.}else{.}. ifelse может использоваться для выбора между двумя (возможно вычисленными) векторами значений на основе логического антецедента. В любом случае вам нужно узнать методы векторизации АиР Первое условие может быть обработан понуждения логический вектор преобразуется в логическое 0/1 числовое значение путем умножения на 1:

REAR$EXCEPTION_1 <- with(REAR , mean < (-2) & mean > 2)*1 # *1 makes numeric 

погоди! Невозможно удовлетворить это условие. Вы запутались в значении AND и OR при построении логических выражений? Разве это не должно быть ???? :

REAR$EXCEPTION_1 <- with(REAR , mean < (-2) | mean > 2)*1 

И второе последствие может быть:

REAR$EXCEPTION_2 <- with(REAR, !(mean < (-2) | mean > 2) & deviation > 1.5)*1 

Вам не нужно окончательный }else{} положение, так как все остальные условия были установлены на нуль первых двух заданий. Я предполагаю, что присвоение SAT $ EXCEPTION_2 было еще одной опечаткой, которую вы еще не исправили.

Если вы используете ifelse, вам нужно понять, что невозможно назначить назначения и, конечно, не множественные назначения для разных векторов.

+0

@BondedDust ... извините за ошибку..отредактированы изменения .. это будет отклонение – Kaushal

Смежные вопросы