从循环中追加rle结果

Fra*_*fka -1 loops r append coin-flipping

我正在进行抛硬币模拟,循环运行大约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
Run Code Online (Sandbox Code Playgroud)

因此,我没有五个单独的rle结果(在此模拟中,完整版中有100万个),我想要一个合并的rle表.希望这很清楚.显然我的实际代码有点复杂,因此任何解决方案都应尽可能接近我指定的代码.

更新:循环是绝对要求.没有ifs或buts.也许我可以拉出表(rle(x))数据并将其放入矩阵中.然而,绊脚石的另一个原因是一些较不频繁的运行长度并不总是在每个循环中出现.因此,我想我希望根据行程数有条件地填充矩阵?

在我放弃之前的最后更新:保留rle $值意味着保留了太多数据.我的模拟是大规模的,我真的只想保留rle的表输出.我保留每个循环的每个表(rle(x))并手动组合(将有数千个),或者我找到一种编程方式来保存数据(对于零和一些是),并且有一个表由在我继续时合并每个循环.

要么这很容易,要么按照规定,或者我不会这样做.这似乎是一个愚蠢的想法/要求,但这应该是偶然的,是否可以做到.

说真的是上次.这是一个动画gif,显示了我期望发生的事情.在此输入图像描述

每次循环后,循环数据都会添加到表中.这很清楚,我将能够进行沟通.

And*_*rie 7

好的,尝试4号:

N <- 5
set.seed(1)
x <- NULL
for (i in 1:N){
  x <- rbind(x, table(rle(sample(0:1, 100000, replace=TRUE))))
}

x <- as.data.frame(x)
x$length <- as.numeric(rownames(x))
aggregate(x[, 1:2], list(x[[3]]), sum)
Run Code Online (Sandbox Code Playgroud)

生产:

   Group.1     0     1
1        1 62634 62531
2        2 31410 31577
3        3 15748 15488
4        4  7604  7876
5        5  3912  3845
6        6  1968  1951
7        7   979   971
8        8   498   477
9        9   227   246
10      10   109   128
11      11    65    59
12      12    24    30
13      13    21    11
14      14     7    10
15      15     0     4
16      16     4     2
17      17     0     1
18      18     0     1
Run Code Online (Sandbox Code Playgroud)

如果您想在循环内部进行聚合,请执行以下操作:

N <- 5
set.seed(1)
x <- NULL
for (i in 1:N){
  x <- rbind(x, table(rle(sample(0:1, 100000, replace=TRUE))))
  y <- aggregate(x, list(as.numeric(rownames(x))), sum)
  print(y)
}
Run Code Online (Sandbox Code Playgroud)

  • @RSoul我已经回答了你提出的问题.你现在正在施加额外的限制,尽管你没有说明它们是什么. (3认同)
  • 唯一显而易见的是,R中几乎不需要循环.如果你觉得令人沮丧的是你没有得到你想要的答案,也许是因为你的问题模糊不清?我们尽力帮助,但我们都没有水晶球.此外,如果OP不是很苛刻,我们发现它更容易提供帮助,而且你的一些评论已经接近了规模的棘手目的. (2认同)
  • 我想知道你们两个是否在交叉目的谈话?OP不需要0或1的数量,而是运行长度数据; 即`$ lengths`.即便如此,他们似乎只关心摘要而不关心实际数据.而@RSoul,如果超过4个SO用户无法理解你想要的是什么,我想知道为什么你似乎认为我们没有得到你想要的东西而不是你需要的更简单的假设是我们的错.解释**和**向我们展示你想要的更好.我确实询问了预期的输出,但你没有在你的问题中编辑它,这有助于消除歧义. (2认同)

Ben*_*ker 7

跟进@ CarlWitthoft的回答,你可能想要:

N <- 5
rlex <-NULL
for (i in 1:N) {
    x <-sample(0:1, 100000, 1/2)
    rlex <-append(rlex, rle(x)$lengths)
}
Run Code Online (Sandbox Code Playgroud)

因为我认为你不关心$values组件(即每次运行是否是一个零或一组).

结果:一个长的运行长度向量.

但这可能会更有效:

maxlen <- 30
rlemat <- matrix(nrow=N,ncol=maxlen)
for (i in 1:N) { 
    x <-sample(0:1, 100000, 1/2)
    rlemat[i,] <- table(factor(rle(x)$lengths,levels=1:maxlen))
}
Run Code Online (Sandbox Code Playgroud)

结果:一个N通过maxlen从每次迭代运行长度的表.

如果您只想保存每个长度的总运行次数,您可以尝试:

rlecumsum <- rep(0,maxlen)
for (i in 1:N) { 
    x <-sample(0:1, 100000, 1/2)
    rlecumsum <- rlecumsum + table(factor(rle(x)$lengths,levels=1:maxlen))
}
Run Code Online (Sandbox Code Playgroud)

结果:maxlen所有迭代中的运行长度总长度的向量.

这是我的最终答案:

rlecumtab <- matrix(0,ncol=2,nrow=maxlen)
for (i in 1:N) { 
   x <- sample(0:1, 100000, 1/2)
   r1 <- rle(x)
   rtab <- table(factor(r1$lengths,levels=1:maxlen),r1$values)
   rlecumtab <- rlecumtab + rtab
}
Run Code Online (Sandbox Code Playgroud)

结果:maxlen所有迭代的总运行长度数乘以2表,除以类型(0运行与1运行).

  • **但你仍然没有告诉我们"合并/合并/将两个表合并为ubertable"意味着什么**.我上面给出了三个答案,我仍然不知道它们中的任何一个是否真的是你想要的.如果显示所需的输出,那么如果提供所需的输出,则任何答案都清楚明确地正确无误.我的最后答案是你想要的,还是没有?您想保留每次运行的结果,还是仅保留总计?您是想将"0运行"和"1运行"长度分布分开,还是仅对整个运行长度分布感兴趣? (2认同)

Car*_*oft 6

您需要阅读帮助页面rle.考虑:

names(rlex)  #"lengths"  "values"  "lengths"  "values" .... and so on
Run Code Online (Sandbox Code Playgroud)

与此同时,我强烈建议你花些时间阅读统计方法.运行二项式模拟百万次的零(+/- epsilon)机会会告诉你在几百次尝试后你将不会学到的任何东西,除非你的硬币有p = 1e-5 :-).