【发布时间】:2019-10-02 04:22:03
【问题描述】:
我有一个带有两个变量 start 和 end 的 data.table DT,我想使用动态向量对其进行编码。 start 和 end 都是某种连续或有序变量(为了便于使用,本例中为整数)。动态向量包含在开始和结束空间中动态选择的数据点。我想根据向量对 data.table 进行编码。
> DT <- data.table(cust = c('A', 'A', 'B', 'C')
, start = c(1,6,2,2)
, end = c(4,8,5,10))
> DT
cust start end
1: A 1 4
2: A 6 8
3: B 2 5
4: C 2 10
> dynamic_vector <- c(2,5,7,11)
每个添加的列都基于动态向量的元素。如果 start
我可以使用 for 循环来做到这一点:
> for (i in dynamic_vector) DT[, (paste0('month_', i)) := (i >= start & end >= i) + 0L]
> DT
cust start end month_2 month_5 month_7 month_11
1: A 1 4 1 0 0 0
2: A 6 8 0 0 1 0
3: B 2 5 1 1 0 0
4: C 2 10 1 1 1 0
如何在不使用 for 循环的情况下做到这一点?我正在处理两个连续变量开始和结束。动态向量可能相当大(几百个元素)。 DT也是一个比较大的表(约50M条目)。 for循环需要很长时间!
【问题讨论】:
-
sapply的功能是否满足非 for 循环方法的条件? -
如果它比for循环快,那么是的
-
只是出于好奇,
DT[, paste0('m', dynamic_vector) := 0L]; for (i in dynamic_vector) DT[i >= start & end >= i, paste0('m', i) := 1L]会更快吗?最快的很可能是Rcpp版本。 -
看起来他们花费了同样多的时间。
标签: r for-loop dynamic encoding data.table