【问题标题】:Dynamic encoding of continuous variables in R data.tableR data.table中连续变量的动态编码
【发布时间】: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 &gt;= start &amp; end &gt;= i, paste0('m', i) := 1L] 会更快吗?最快的很可能是Rcpp 版本。
  • 看起来他们花费了同样多的时间。

标签: r for-loop dynamic encoding data.table


【解决方案1】:

使用%between%Map,然后一次性分配:=所有输出变量:

DT[
  ,
  paste0("month_", dynamic_vector) := lapply(
    Map(`%between%`, dynamic_vector, .(.(start,end))), as.integer
  )
]

#   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

【讨论】:

  • 这看起来很顺利。在较小的测试集上,这需要的时间减少了 19%。我会等着看是否有任何其他解决方案可以进一步提高性能。非常感谢。
  • 还有between 函数,因此可能不需要引用%between%。而且这个函数是矢量化的,所以最终可能不需要Map,但我不确定,因为我没有很好地进入这个Q。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2022-11-15
  • 2023-02-03
  • 2015-02-07
相关资源
最近更新 更多