Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从循环中追加rle结果_R_Loops_Append_Coin Flipping - Fatal编程技术网

从循环中追加rle结果

从循环中追加rle结果,r,loops,append,coin-flipping,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

我正在运行一个掷硬币模拟,循环大约运行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

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

names(rlex)  #"lengths"  "values"  "lengths"  "values" .... and so on
同时,我强烈建议你花些时间阅读统计方法。有零(+/-epsilon)的可能性,运行一个二项式模拟一百万次会告诉你任何你在几百次尝试后学不到的东西,除非你的硬币有p=1e-5:-)

好,第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)

如果希望在循环中进行聚合,请执行以下操作:

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

N跟进@CarlWitthoft的答案,您可能想要:

N <- 5
rlex <-NULL
for (i in 1:N) {
    x <-sample(0:1, 100000, 1/2)
    rlex <-append(rlex, rle(x)$lengths)
}
结果:一个
N
by
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))
}

结果:一个
maxlen
除以所有迭代的运行长度总数的2表,除以类型(0-run vs 1-run)。

虽然我确信这很好,但我不能在我的(更复杂的)代码中使用它。我要么满足于数千张单独的表格(我必须手工组合),要么找到问题中所述的解决方案。谢谢。@r我已经回答了你的问题。您现在施加了额外的约束,尽管您没有说明它们是什么。@RSoul自从您修改问题以强制循环后,我编辑了我的答案。唯一显而易见的是,在R中几乎不需要循环。如果您发现没有得到所需的响应令人沮丧,也许是因为你的问题含糊不清?我们试图帮忙,但没有一个人有水晶球。此外,我们发现如果OP不刺耳,我们会更容易提供帮助,而且你的一些评论已经接近了刺耳的程度。我想知道你们两个是不是言不由衷?OP不需要0或1的数量,而是运行长度数据;i、 e.
$length
。即便如此,他们似乎只关心摘要,而不关心实际数据。而@RSoul,如果4+用户在理解你想要的东西时遇到困难,我真想知道为什么你似乎认为我们没有得到你想要的东西是我们的错,而不是你需要解释和向我们展示你想要的更好的更简单的假设。我确实要求获得预期的输出,但您尚未将其编辑到您的问题中,这将有助于消除歧义。如果您使用for循环,我建议您预先分配
rlex
变量以适应结果。这将使事情运行得更快。建议阅读Pat Burns的《优化:R地狱》一书。我并不是真的为速度而烦恼。我已经运行过一次模拟,所用的时间是合理的。我对保留rle数据并将其纳入我已经在工作的代码中感兴趣。我可能会帮助您展示您期望返回的内容。无论如何,为什么不使用两个向量
长度
,并附加每个向量,而不是尝试附加两个向量的复杂列表。我想分配存储而不是追加,但如果您不关心效率的话,您可以处理这个问题。我想知道是否有足够的空间将这些数据存储在内存中。如果您只需要表格摘要,那么存储所有信息是浪费的。针对您对问题的第二次修改:在我的回答中,我展示了如何强制
rle
始终具有相同的长度,如果您从一个因子中采样。R中的每件事都很简单,只要你清楚地说明问题是什么。-1(我投了反对票)这个问题当时很不清楚想要什么。它正在变得更好,但我仍然必须从评论和更新的线索中推断出需要什么。一些预期产出如何!如果你表现出我们可以消除模棱两可,我可以取消否决票。事实上,这是我所能做到的。我认为这将保留太多的数据。我实际上只需要表的输出(rle(x)),在每个循环之后合并。如果这是明确的(似乎不是)。谢谢。你说的“合并”是指只保留每种长度的跑步总数吗?您可以使用
colSums(rlemat)
将矩阵折叠为总计,也可以为每个循环设置
rlecumsum Merged。长度为1、2、3、4的运行次数合并为总数。真的那么不清楚吗?嗯,是的,它是:“合并”是相当模糊的,因为这个术语也意味着将多个表的列合并到一个表中。。。在您的问题中显示您的示例所需的输出是消除歧义的一个好方法。但是您还没有告诉我们“合并/合并/将两个表合并到ubertable”是什么意思。我在上面给出了三个答案,但我仍然不知道其中是否有一个是你真正想要的。如果您显示所需的输出,那么任何答案都是明确无误的正确答案,前提是它提供了所需的输出。我最后的答案是不是你想要的??您想保留每次运行的结果,还是只保留总数?您希望将“0运行”和“1运行”长度分布分开,还是只对总体运行长度分布感兴趣?
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))
}
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))
}
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
}