【发布时间】:2012-10-05 06:30:31
【问题描述】:
我正在运行一个掷硬币模拟,循环运行大约 100 万次。
每次运行循环时,我都希望保留 RLE 命令的表输出。不幸的是,一个简单的附加似乎并不合适。每次我运行循环时,我得到的数据量都略有不同,这似乎是症结之一。
这段代码让我知道我在做什么:
N <- 5 #Number of times to run
rlex <-NULL
#begin loop#############################
for (i in 1:N) { #tells R to repeat N number
x <-sample(0:1, 100000, 1/2)
rlex <-append(rlex, rle(x))
}
table(rlex) #doesn't work
table(rle(x)) #only 1
因此,我想要一个合并的 rle 表,而不是拥有五个单独的 rle 结果(在此模拟中,完整版为 100 万)。希望这很清楚。显然我的实际代码有点复杂,因此任何解决方案都应该尽可能接近我指定的。
更新:循环是绝对要求。没有如果或但是。也许我可以提取 table(rle(x)) 数据并将其放入矩阵中。然而,同样的绊脚石是一些不太频繁的运行长度并不总是在每个循环中出现。因此,我想我希望根据运行长度数有条件地填充矩阵?
我放弃之前的最后一次更新:保留 rle$values 将意味着保留了太多数据。我的模拟是大规模的,我真的只希望保留 rle 的表输出。要么我为每个循环保留每个表(rle(x))并手动组合(会有数千个),要么我找到一种编程方式来保存数据(对于零和一来说是)并拥有一个由以下组成的表在我进行的过程中合并每个单独的循环。
要么按照规定,这很容易做到,要么我不会这样做。这似乎是一个愚蠢的想法/要求,但这应该与是否可以完成无关。
上次说真的。这是一个动画 gif,显示了我期望发生的事情。
在循环的每次迭代之后,数据被添加到表中。这一点我将能够传达的很清楚。
【问题讨论】:
-
如果您使用 for 循环,我建议您预先分配
rlex变量以适应结果。这将使事情运行得更快。优化建议阅读:Pat Burns 的 The R Inferno。 -
我对速度并不在意。我已经运行了一次模拟,所花费的时间是合理的。我有兴趣保留 rle 数据并将其容纳在我已经工作的代码中。
-
我可能会帮助您展示您期望看到的返回内容。无论如何,为什么不拥有两个向量
lengths和values并附加每个向量,而不是尝试附加两个向量的复杂列表。我会分配存储而不是追加,但如果你不关心效率,你可以处理它。我确实想知道是否有足够的空间将这些数据存储在内存中。如果您只需要表格摘要,则存储所有信息是一种浪费。 -
针对您对问题的第二次修改:在我的回答中,我展示了如果您从一个因子中采样,如何强制
rle始终具有相同的长度。只要你清楚地指出问题所在,R 中的一切都很容易。 -
-1(我投了反对票)这个问题很不清楚当时想要什么。它正在变得更好,但我仍然不得不从 cmets 和更新的踪迹中推断出想要的东西。一些预期的输出怎么样!如果您表明我们可以消除歧义,我可以删除反对票。
标签: r loops append coin-flipping