2016-11-01 2 views
-1

Я довольно новый с R, и я следил за многими учебниками за последние недели, чтобы улучшить себя на нем.R - Использование значения предыдущей строки на лету

Я пытаюсь достичь чего-то, чего я не уверен с R. Я хочу, из набора данных, вычислить новое значение, используя значение этого набора данных из другой строки.

Я получил простую таблицу ввода так:

InVal 
1: 100 
2: 10 
3: -5 
4: 10 

И я хочу, чтобы вычислить для каждой строки, сумма Inval, если она положительна и повторно использовать предыдущий результат Inval, если нет.

Для этого я создал новые седловины и инициализировать его с 0 и добавить 0-строку для initData:

InVal Result 
1:  0  0 
2: 100  0 
3: 10  0 
4: -5  0 
5: 10  0 

Тогда я попробовал это ожидал, что это будет делать работу:

DT[ , Result := InVal + shift(Result, 1L, type="lag")] 

Но я получить это:

InVal Result 
1:  0  NA 
2: 100 100 
3: 10  10 
4: -5  -5 
5: 10  10 

кажется R я, используя 0 в качестве результата для всех строк, а не фактический RESU Он вычисляет строку раньше. Я думал, что R исполнялся последовательно?

У вас есть идеи, как я могу достичь своей цели? Спасибо :)

+1

Каков ваш ожидаемый выход? – akrun

ответ

2

Я понимаю, что вы хотите получить суммарную сумму серии, но хотите скопировать сумму из предыдущей строки, где значение меньше нуля. Это можно сделать, заменив все значения -ve на 0 и затем найдя cumsum.

require(data.table) 

dt=data.table(Inval=c(100,10,-5,10)) 
dt 

dt[,Result:= Inval] 
dt 
dt[Result<0, Result:=0 ] 
dt 

dt[, Result:=cumsum(Result)] 
dt 
+1

Альтернативно 'dt [, cumsum (Inval * (Inval> 0))]', я думаю. – Frank

+1

Да, сэр. Хотя размножение с булевым может смутить некоторых, это, безусловно, самый короткий и гладкий способ сделать это. –

+0

Спасибо большое, ребята, Это именно то, что я искал :) – nonochehe

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