查找小于给定值的向量的最后位置非常简单(参见例如this question
但是,对于data.frame或data.table中的列,逐行执行此操作非常慢。例如,我们可以这样做(这对小数据是好的,但对大数据不好)
library(data.table)
set.seed(123)
x = sort(sample(20,5))
# [1] 6 8 15 16 17
y = data.table(V1 = 1:20)
y[, last.x := tail(which(x <= V1), 1), by = 1:nrow(y)]
# V1 last.x
# 1: 1 NA
# 2: 2 NA
# 3: 3 NA
# 4: 4 NA
# 5: 5 NA
# 6: 6 1
# 7: 7 1
# 8: 8 2
# 9: 9 2
# 10: 10 2
# 11: 11 2
# 12: 12 2
# 13: 13 2
# 14: 14 2
# 15: 15 3
# 16: 16 4
# 17: 17 5
# 18: 18 5
# 19: 19 5
# 20: 20 5
是否有快速,矢量化的方式来获得相同的东西?最好使用data.table或base R。
答案 0 :(得分:2)
您可以使用findInterval
y[ , last.x := findInterval(V1, x)]
使用cut
稍微复杂一点。但另一方面,你马上得到NA
:
y[ , last.x := as.numeric(cut(V1, c(x, Inf), right = FALSE))]
答案 1 :(得分:-1)
基础R非常简单
x<-c(6L, 8L, 15L, 16L, 17L)
y<-1:20
cumsum(y %in% x)
[1] 0 0 0 0 0 1 1 2 2 2 2 2 2 2 3 4 5 5 5 5