我对R很新,我在最近几周遵循了很多教程来改进自己。
我正在尝试用R来实现我不能确定的东西。我想从数据集中使用来自不同行的该数据集的值来计算新值。
我有一个像这样的简单输入表:
InVal Result
1: 0 0
2: 100 0
3: 10 0
4: -5 0
5: 10 0
我想为每一行计算InVal的总和,如果它是正数,则重新使用InVal的先前结果。
为此我创建了一个新的col并用0初始化它并为initData添加一个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
但我得到了这个:
ID | drug
-----------
1 | drug1
1 | drug2
1 | drug3
2 | drug3
2 | drug5
3 | drug1
3 | drug3
3 | drug4
3 | drug5
似乎R i使用0作为所有行的结果而不是之前计算该行的实际结果。我以为R是按顺序执行的?!
你知道我怎样才能达到我的目标? 谢谢:))
答案 0 :(得分: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