对于一列的每个值,找到哪个是另一个较低的向量的最后一个值

时间:2018-01-09 22:18:52

标签: r

查找小于给定值的向量的最后位置非常简单(参见例如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。

2 个答案:

答案 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