首页 > 解决方案 > 根据每行的列间隔分配值的有效方法

问题描述

我想根据每行中不同的值范围更新列(加 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)

有没有办法通过这个计算来提高速度?

标签: rfor-loopdata.table

解决方案


Here is another option:

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]

推荐阅读