простой оператор if в синтаксической ошибке в R - PullRequest
0 голосов
/ 13 марта 2012

Я хотел бы R к следующему: если LocID равен 3,4,7,8, 14, то данные $ newConc равны данным $ conc / 2 иначе data $ newConc <- data $ conc # остальное оставьте conc неизменным </p>

data$newConc <- if(data$LocID == c(3,4,7,8,14))
data$conc/2 else data$conc

str(data)
 $ LocID     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ time      : int  1 1 1 1 1 1 1 1 1 1 ...
$ conc      : num  0.03695 0.0155 0.00738 0.00753 0.01795 ...

Внимание: условие имеет длину> 1, и будет использоваться только первый элемент

1 Ответ

5 голосов
/ 13 марта 2012

Насколько я могу судить по вашему коду (который даже не запускается из-за отсутствия закрывающей скобки?) Вы пытаетесь сделать (псевдокод):

foreach row in data
    if row$LocID is one of 3, 4, 7, 8, or 14
    THEN set row$newConc to row$conc/2
    ELSE set row$newConc to row$conc

Для этоговы используете ifelse.

Также, если вы хотите проверить, равно ли значение 3, 4, 7, 8 или 14, не используйте == - это вернет вектор логических значений, а if требует одиночного логического значения, следовательно, ваша ошибка.

Либо используйте data$locID %in% c(3,4,7,8,14) для возврата одиночного ИСТИНА/ FALSE, или используйте any(data$locID == c(3,4,7,8,14)), чтобы превратить вектор логических значений в один логический:

Вы сравниваете скаляр с вектором, и поэтому вы выводите вектор.Оператор if принимает только один логический (не вектор логических значений).

Либо используйте data$locID %in% c(3,4,7,8,14), чтобы вернуть single TRUE / FALSE, либо используйте any(data$locID == c(3,4,7,8,14)) дляпревратить вектор логических значений в один логический:

data$newConc <- ifelse( data$locID %in% c(3,4,7,8,14),
                        data$conc/2,
                        data$conc )

В качестве альтернативы я мог бы использовать ifelse( any(data$locID == c(3,4,7,8,14)), ... ).

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