【问题标题】:Efficient way to assign values depending on a column interval for each row根据每行的列间隔分配值的有效方法
【发布时间】:2020-06-14 14:55:32
【问题描述】:

我想根据每行中不同的值范围更新列(加 1)。我逐行迭代的尝试结果很慢。我举一个小例子。

M <- matrix(0,nrow = 50*10^3,ncol = 100)
library(data.table)
M <- as.data.table(M)
n <- nrow(M)
set.seed(4234)
M[, `:=` (a=sample(50,n,replace = T),
          b=sample(50:100,n,replace = T))]

for (x in 1:n) 
  set(M,i=x,j=M[['a']][x]:M[['b']][x], value = 1L)

有什么方法可以加快计算速度?

【问题讨论】:

  • 请在代码中注明library调用,这次我帮你了。
  • 上下文+最终目标是什么?

标签: r for-loop data.table


【解决方案1】:

这是另一种选择:

cols <- paste0("V", 1L:100L)
M[, (cols) := {
    m <- as.matrix(.SD)
    l <- mapply(function(x,y) seq(x, y), a, b, SIMPLIFY=FALSE)
    m[cbind(rep(1L:.N, lengths(l)), unlist(l))] <- 1L
    as.data.table(m)
}, .SDcols=cols]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多