r - 根据每行的列间隔分配值的有效方法
问题描述
我想根据每行中不同的值范围更新列(加 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)
有没有办法通过这个计算来提高速度?
解决方案
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]
推荐阅读
- flutter - 颤振防止小部件重建
- dataframe - 将大熊猫数据框存储到 csv 文件中
- html - Twitter 分享按钮未显示在网站中
- python - 如何将字符串列表分成一行/单元格中的几行?
- c - 在 macOS Big Sur 上接收 UDP 多播
- svg - createSVGPoint 不是 Nextjs 中的函数
- installation - Apache Netbeans 未编译
- amazon-web-services - 使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数
- python-3.x - 使用 random.choice() 从分配的列表中获取随机键和随机词到键
- node.js - 将 sequelize 与 TypeScript 一起使用:如何连接具有附加属性的表?