gpt4 book ai didi

r - 迭代复制前一行然后随机覆盖一个单元格的最快实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:37 24 4
gpt4 key购买 nike

此代码对于 n.col=31 来说很慢; n.row=1600000,我想不出如何在 R 中优化它。我需要知道每一步的几个项目的余额,但每一步只有一个余额变化。我有一个余额更新向量 data 和一个索引向量 col.i,它告诉我余额更新属于哪个项目。根据这些,我的目标是生成一个数据框,显示每个步骤中每个项目的余额,每个步骤一行。

n.col = 31;   n.row = 1600000
col.i <- sample( 1:n.col, size=n.row, replace=T)
data <- rnorm( n=n.row, mean=0, sd=1)
grid <- as.data.frame( matrix( ncol=n.col, nrow=n.row, data=0))

grid[ 1, col.i[1]] <- data[1]
for(i in 2:nrow(grid))
{
grid[i,] <- grid[i-1,]
grid[i, col.i[i]] <-data[i]
}

最佳答案

我们通过基于 行/列 索引分配值(除了将“网格”保持为 matrix 而不是 data. frame - 正如评论中提到的@AndreyShabalin)

library(zoo)
system.time({
grid[ 1, col.i[1]] <- data[1]

for(i in 2:nrow(grid))
{
grid[i,] <- grid[i-1,]
grid[i, col.i[i]] <-data[i]
}

})
# user system elapsed
# 8.36 0.16 8.57



system.time({
grid2[cbind(seq_len(nrow(grid2)), col.i)] <- data
grid2 <- na.locf(grid2*(NA^!grid2), na.rm = FALSE)
grid2 <- replace(grid2, is.na(grid2), 0)

})
# user system elapsed
# 3.50 2.01 5.52
identical(grid, grid2)
#[1] TRUE

上面的瓶颈是na.locf

数据

n.col = 31;   n.row = 1600000
set.seed(24)
col.i <- sample( n.col, size=n.row, replace=T)
data <- rnorm( n=n.row, mean=0, sd=1)
grid <- matrix( ncol=n.col, nrow=n.row, data=0)
grid2 <- grid

关于r - 迭代复制前一行然后随机覆盖一个单元格的最快实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com