我正在进行抛硬币模拟,循环运行大约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,显示了我期望发生的事情。
每次循环后,循环数据都会添加到表中。这很清楚,我将能够进行沟通。
答案 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))
}
结果:每次迭代的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))
}
结果:所有迭代中运行总长度的长度为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 :-)。