避免循环:在一个时间范围内定义动作块

用户名

我需要定义操作块-因此,我希望将所有操作归为一个ID,该操作距上一次操作不到30天。如果自上次操作以来已超过30天,那么我将标签加1(因此标签2、3、4 ...)。每个新的ID将从1开始。

数据如下:

dat = data.frame(cbind(
  id = c(rep(1,2), rep(16,3), rep(17,24)),
  ##day_id is the action date in %Y%m%d format - I keep it as numeric but could potentially turn to a date.
  day_id = c(20130702, 20130121, 20131028, 20131028, 20130531, 20140513, 20140509,    
         20140430, 20140417, 20140411, 20140410, 20140404,
         20140320, 20140313, 20140305, 20140224, 20140213, 20140131, 20140114,  
         20130827, 20130820, 20130806, 20130730, 20130723,
         20130719, 20130716, 20130620, 20130620, 20130614 ),
  ###diff is the # of days between actions/day_ids
  diff =c(NA,162,NA,0,150,NA,4,9,13,6,1,6,15,7,8,9,11,13,17,140,7,14,
         7,7,4,3,26,0,6),
  ###Just a flag to say whether it's a new id
  new_id = c(1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
))

我已经使用for循环完成了此操作,并设法避免在循环内进行循环(请参见下文),但似乎无法摆脱该外部循环。当然,成千上万的id会变得非常慢。在下面的示例中,“ call_block”是我要复制的内容,但没有for循环。谁能帮我摆脱困境吗?

max_days = 30
r = NULL
for(i in unique(dat$id)){
  d = dat$diff[dat$id==i]
  w = c(1,which(d>=max_days) , length(d)+1)
  w2 = diff(w)

  r = c(r,rep(1:(length(w)-1), w2))
}
dat$call_block = r

谢谢!

弗里克先生

在此处发布@alexis_laz的答案以结束问题

library(data.table)
f = function(x){ 
    ret = c(1, cumsum((x >= 30)[-1]) + 1) 
    return(ret = ret) 
}
df = data.table(dat)
df2 = df[,list(call_block= f(diff)), by = id]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

计算一个时间在一个日期范围内出现的次数

确定一个时间范围内SQL代理的预期运行时间

在当前时间范围内绘制另一个时间范围内的指标

RXJS 显示一个时间范围内的累计结果

Spark 1.5.2:在一个时间范围内对DataFrame行进行分组

SQL获取一个时间范围内的所有值-以及之前的值

如何在一个时间范围内按多列查找重复的行

如何安排Windows任务在一个时间范围内每天重复?

检查LocalDateTime是否在一个时间范围内

SQL查询以获取在一个时间范围内包含多个实例的值

如何使另一个函数内定义的函数在窗口范围内?

无法从另一个函数(在全局范围内定义)访问变量(数组)

在 R 中测试 case 是否在一个时间范围内和一个唯一的 ID

是否有一个 Excel 公式可以返回一个时间范围内的日历月数?

如何设计一个表,记录一个时间范围内的客户状态?

比较时间:检查给定时间是否在另一个时间范围内

如何修改数据以在另一个时间的特定范围内删除ID

有没有办法让 worksheetfunction.randbetween 在一个时间范围内工作?

在一个封闭的范围内定义本地变量日志必须被最终或最后有效

检查一个时间范围是否进入另一个时间范围

将一个时间范围缩小到另一个时间范围的算法

检查时间是否在一个时间范围内,还检查用户是否仅给出开始时间或结束时间

在一个时间间隔内运行Asyncio循环

将时间范围列表中的所有项目计数为一个时间范围

输入多个时间范围然后返回所有另一个时间范围

在另一个用户的邮政编码范围内定位用户

选择在一个时间范围内显示最少n条记录的所有唯一条目

在一个时间间隔内生成时间戳范围并查询所有重叠事件

在给定的时间间隔内,一个时间范围有多少小时?