【问题标题】:How to append a growing array to itself efficiently如何有效地将不断增长的数组附加到自身
【发布时间】:2017-08-04 03:58:31
【问题描述】:

我有一个带有 id 和 value 列的数据框“v”,例如:

set.seed(123)
v <- data.frame(id=sample(1:5),value=sample(1:5))
v
  id value
1  2   1
2  4   3
3  5   4
4  3   2
5  1   5

在循环中,我想找到v的id与tmp匹配的v的索引,然后根据这个索引找到v的子集。 tmp 是 v$id 的“替换”示例

这是我的尝试:

df <- vector(mode='list',length = iter)
iter = 1

for (i in 1:iter) 
{ 
  tmp <- sample(v$id, replace=T)

  index.position <- NULL
  for (j in 1:length(tmp)) {index.position <- c(index.position, which(v$id %in% tmp[j]) )}

  df[[i]] <- v[index.position,]
}
tmp
[1] 1 5 3 5 2
df
[[1]]
    id value
5    1     5
3    5     4
4    3     2
3.1  5     4
1    2     1

这按预期工作。但是,当 "v" 和 "iter" 都很大时,执行速度非常慢,因为增大 index.position 数组的内存效率不高。

我还尝试创建一个空矩阵或列表作为占位符,然后在循环时为其分配 index.position,但并没有真正加快进程。 (参考:Growing a data.frame in a memory-efficient manner

编辑:id 在 v 中“不是”唯一的

【问题讨论】:

  • 如果idv 中是唯一的,那么采样id 值并匹配它们以获取行索引是一种非常低效的采样行索引的方法。我想你可以这样做df &lt;- replicate(n = iter, expr = v[sample(nrow(v), replace = T), ], simplify = FALSE)

标签: r


【解决方案1】:

尽量避免 for...for... 循环。这是非常低效的。等于:

for (i in 1:iter) 
{ 
  df[[i]] <- v[sample(nrow(v),replace = T),]
}

Gregor 解决方案的更详细版本...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2021-03-24
    • 2018-11-30
    • 2013-11-28
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多