从循环中追加rle结果

时间:2012-10-15 09:41:49

标签: r loops 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

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

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

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

如果指定的话,这很容易做,或者我不会这样做。这似乎是一个愚蠢的想法/要求,但这应该是偶然的,是否可以做到。

严重上次。这是一个动画gif,显示了我期望发生的事情。 enter image description here

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

3 个答案:

答案 0 :(得分: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)

产地:

   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

如果你想在循环中进行聚合,请执行:

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)
}

答案 1 :(得分:7)

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

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

因为我认为你不关心$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))
}

结果:每次迭代的Nmaxlen运行长度表。

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

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))
}

结果:所有迭代中运行总长度的长度为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
}

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

答案 2 :(得分:6)

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

names(rlex)  #"lengths"  "values"  "lengths"  "values" .... and so on

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