我有一个数据框架,如下所示:
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
中减去AMT>0
来实现的(例如,第二个AMT>0
的参考时间为4。因此,TIME2
是通过减去5-4=1
、7-4=3
、9-4=5
等来计算的。如何在R中自动实现这一点?)
发布于 2015-06-14 12:37:15
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
发布于 2015-06-14 12:40:07
最初发布的答案与@agstudy相同,因此这里有一个可能的基R解决方案
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
或
library(dplyr)
df %>%
group_by(cumsum(AMT > 0), ID) %>%
mutate(TIME2 = TIME - first(TIME))
https://stackoverflow.com/questions/30829333
复制相似问题