【问题标题】:For each value of one column, find which is the last value of another vector that is lower对于一列的每个值,找出哪个是另一个较低的向量的最后一个值
【发布时间】:2018-01-10 15:37:47
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用findInterval

    y[ , last.x := findInterval(V1, x)]
    

    使用cut 稍微复杂一些。但另一方面,您会立即获得NAs:

    y[ , last.x := as.numeric(cut(V1, c(x, Inf), right = FALSE))]
    

    【讨论】:

      【解决方案2】:

      在基础 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
      

      【讨论】:

      • 这可能适用于 OP 中的简单情况,但请尝试y &lt;- c(7, 9, 18)
      • 真相!不知道findInterval() 功能我可能会对你新提出的问题apply(sapply(y,"&gt;",x),2,sum) 做这样的事情
      猜你喜欢
      • 2015-01-02
      • 1970-01-01
      • 2019-04-19
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2020-01-17
      相关资源
      最近更新 更多