我有一个如下所示的数据框:
ID TIME AMT
1 0 50
1 1 0
1 2 0
1 3 0
1 4 0
1 4 50
1 5 0
1 7 0
1 9 0
1 10 0
1 10 50
上述数据框中的TIME
列是连续的。我想添加另一个时间列,在AMT>0
时将时间从零重置。所以,我的输出数据框应如下所示:
ID TIME AMT TIME2
1 0 50 0
1 1 0 1
1 2 0 2
1 3 0 3
1 4 0 4
1 4 50 0
1 5 0 1
1 7 0 3
1 9 0 5
1 10 0 6
1 10 50 0
这基本上是通过在TIME
时从“固定”引用TIME
中减去AMT>0
来实现的(例如,第二个AMT>0
的参考时间是4。因此,TIME2
的计算方法是减去5-4=1
; 7-4=3
; 9-4=5
等。如何在R中自动执行此操作。
答案 0 :(得分:5)
data.table
解决方案:
library(data.table)
setDT(DT)[,TIME2 := TIME-TIME[1],cumsum(AMT>0)]
# ID TIME AMT TIME2
# 1: 1 0 50 0
# 2: 1 1 0 1
# 3: 1 2 0 2
# 4: 1 3 0 3
# 5: 1 4 0 4
# 6: 1 4 50 0
# 7: 1 5 0 1
# 8: 1 7 0 3
# 9: 1 9 0 5
# 10: 1 10 0 6
# 11: 1 10 50 0
答案 1 :(得分:4)
最初发布与@agstudy相同的答案,所以这里可选择一个可能的基础R解决方案
find -iname 'PATCH*' -exec sed -i 's#`which cat`#/bin/cat#g' {} \;
或者
with(df, ave(TIME, cumsum(AMT > 0L), ID, FUN = function(x) x - x[1L]))
## [1] 0 1 2 3 4 0 1 3 5 6 0