我们可以用以下内容替换您的循环diff()
计算向量中相邻索引之间的差异的函数,例如:
> diff(c(1,3,6,10))
[1] 2 3 4
我们可以在此之前添加Inf
通过差异c(Inf, diff(x))
.
接下来我们需要将上述内容应用到每个user_id
单独。为此有很多选择,但这里我使用aggregate()
。令人困惑的是,这个函数返回一个带有time
本身就是一个矩阵的组件。我们需要将该矩阵转换为向量,这取决于 R 中首先填充矩阵列的事实。最后,我们添加和interval
根据函数的原始版本将其添加到输入数据列。
interval <- function(x) {
diffs <- aggregate(time ~ user_id, data = x, function(y) c(Inf, diff(y)))
diffs <- as.numeric(diffs$time)
x <- within(x, interval <- diffs)
x
}
下面是一个稍微扩展的例子,每个用户有3个时间点,来说明上面的功能:
> visit_log = data.frame(user_id = rep(1:5, 3), time = 1:15)
> interval(visit_log)
user_id time interval
1 1 1 Inf
2 2 2 Inf
3 3 3 Inf
4 4 4 Inf
5 5 5 Inf
6 1 6 5
7 2 7 5
8 3 8 5
9 4 9 5
10 5 10 5
11 1 11 5
12 2 12 5
13 3 13 5
14 4 14 5
15 5 15 5