如何有效地将不断增长的数组附加到自身

时间:2017-03-13 23:45:42

标签: r

我有一个带有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的索引,其中v的id与tmp匹配,然后根据该索引查找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

中不是唯一的”

1 个答案:

答案 0 :(得分:0)

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

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

格雷戈尔解决方案的详细版本......