2017-01-01 4 views
3

То, что я пытаюсь сделать, это если строка в столбце b равна 2, то я хочу добавить 3 к значению предыдущей строки в столбце a. И если условие не выполнено, то я не хочу, чтобы значение предыдущей строки менялось. Когда я пробую этот код, однако R добавляет к следующей строке. И неважно, что я заменяю ссылку на строку -1, и она всегда добавляет к следующей строке.Как добавить значение к предыдущей строке, если условие выполнено

df$a[-1] <- ifelse(df$b == 2, df$a[-1] + 3, df$a[-1]) 

Have        Want 
a b        a b 
0 1        0 1 
1 3        4 3 
2 2        2 2 
2 4        2 4 
4 5        4 5 
+0

Кроме того, вы не доплачиваете за кодом пробельных на SO, он включен в план членства. – hrbrmstr

ответ

2

Другой подход

df <- data.frame(a=c(0, 1, 2, 2, 3), 
      b=c(1, 3, 2, 4, 4)) 

df$a[c(df$b[-1], 0) == 2] <- df$a[c(df$b[-1], 0) == 2] + 3 
+0

Возможно, вы захотите включить общее условие в отдельную строку. –

+0

Спасибо, что это сработало для меня. – grig109

3

Одно из решений:

я нашел бы, что проще всего работать с векторами непосредственно, например, так:

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) 

Если какие-либо из моих объяснений не ясно, не стесняйтесь комментировать и Я постараюсь помочь!

+1

Спасибо за подробное объяснение. Это помогло мне лучше понять логику моей первоначальной попытки, и почему это не удалось. – grig109