【发布时间】:2018-08-08 13:43:13
【问题描述】:
我有数据
library(data.table)
set.seed(42)
t <- data.table(time=1:1000, value=runif(100,0,1))
p <- data.table(id=1:10, cut=sample(1:100,5))
vals <- 1:5
> head(t)
time value
1: 1 0.9148060
2: 2 0.9370754
3: 3 0.2861395
4: 4 0.8304476
5: 5 0.6417455
6: 6 0.5190959
> head(p)
id cut
1: 1 63
2: 2 22
3: 3 99
4: 4 38
5: 5 91
6: 6 63
> vals
[1] 1 2 3 4 5
其中t 给出了与时间点相关的values 的一些向量,p 为每个人给出了time 的截止值。
我想为每个人获取累积vals 中每个值所需的时间单位。
我现在的方法是使用 for 循环,为每个人计算累积和的临时向量,从 time 中的特定截止点开始。接下来,我使用findInterval()获取cumsum到达vals中各个级别的位置。
out <- matrix(NA, nrow=nrow(p), ncol=length(vals)); colnames(out) <- vals
for(i in 1:nrow(p)){
temp <- cumsum(t$value[t$time > p$cut[i]]); temp <- temp[!is.na(temp)]
out[i,] <- findInterval(vals,temp)
}
应该产生的
1 2 3 4 5
[1,] 1 4 5 9 12
[2,] 1 2 5 6 7
[3,] 1 2 4 5 7
[4,] 1 3 5 7 8
[5,] 2 3 5 7 8
[6,] 1 4 5 9 12
[7,] 1 2 5 6 7
[8,] 1 2 4 5 7
[9,] 1 3 5 7 8
[10,] 2 3 5 7 8
这当然是非常低效的,并且不能充分发挥 R 的能力。有没有办法加快速度?
【问题讨论】:
-
你能再看看你的示例数据吗?例如,条件
t$value > p$cut[i]始终为FALSE;因此没有什么可总结的。 -
让我检查一下,对不起!
-
抱歉,我混淆了两个变量并选择
valsunwisely 在此处打印。现在应该修好了!
标签: r data.table vectorization