Одно из решений:
я нашел бы, что проще всего работать с векторами непосредственно, например, так:
df$a <- df$a + c((df$b[-1] == 2) * 3, 0)
Вопрос с вашим кодом:
Вы получаете следующую строку в своем заявлении, потому что каждый элемент первого аргумента, df$b==2
соответствует следующему ряду df$a
. Давайте посмотрим на пример в вашем вопросе, чтобы проиллюстрировать:
df <- data.frame(a=c(0,1,2,2,4), b=c(1,3,2,4,5)) # As in your question
Здесь df$b==2
эквивалентно c(FALSE, FALSE, TRUE, FALSE, FALSE)
.
df$a[-1]
- все элементы df$a
, за исключением первого, то есть эквивалента c(1,2,2,4)
. Поскольку длины аргументов различаются, первый элемент df$a[-1]
повторяется/зацикливается, например c(1,2,2,4,1)
.
Таким образом, в своем заявлении, первый элемент df$b==2
согласован с первым элементом df$a[-1]
или второй элемент df$a
(т.е. последующая строка), а второй элемент df$b==2
сравнивается с третьим элементом df$a
и т.д.
в этом примере, код даст следующий результат:
ifelse(df$b==2, df$a[-1]+3, df$a[-1])
# Output: 1 2 5 4 1
способ скорректировать код:
Потому что вы хотите сравнить второй элемент df$b
к первому из df$a
и так далее, вы можете настроить свой код следующим образом:
df$a[-nrow(df)] <- ifelse(df$b[-1]==2, df$a+3, df$a)
Если какие-либо из моих объяснений не ясно, не стесняйтесь комментировать и Я постараюсь помочь!
Кроме того, вы не доплачиваете за кодом пробельных на SO, он включен в план членства. – hrbrmstr