【发布时间】: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 中“不是”唯一的
【问题讨论】:
-
如果
id在v中是唯一的,那么采样id值并匹配它们以获取行索引是一种非常低效的采样行索引的方法。我想你可以这样做df <- replicate(n = iter, expr = v[sample(nrow(v), replace = T), ], simplify = FALSE)
标签: r