2

Rの問題に取り組んでいる(非常に)アマチュアのコーダー兼統計学者。

A、B、C、D の 4 つの整数リストがあります。

A <- [1:133]
B <- [1:266]
C <- [1:266]
D <- [1:133, 267-400]

R がこれらのリストのそれぞれから 1 つの項目を選択することですべての順列を生成し (このコードの実行には永遠に時間がかかることはわかっています)、次にそれらの順列のそれぞれの平均をとります。たとえば、[1, 100, 200, 400] -> 175.25.

理想的には、最後にこれらすべての手段のリストを作成します。

何か案は?

4

2 に答える 2

1

小さいが同様の問題に対してこれを行う方法は次のとおりです。

A <- 1:13
B <- 1:26
C <- 1:26
D <- c(1:13, 27:40)

mymat <- expand.grid(A, B, C, D)
names(mymat) <- c("A", "B", "C", "D")
mymat <- as.matrix(mymat)
mymeans <- rowSums(mymat)/4

すべてのインデックスを作成すると、おそらく R がクラッシュしますが、おそらく次のようなループを設定できます (テストされていません)。

B <- 1:266
C <- 1:266
D <- c(1:133, 267:400)

for(A in 1:133) {
    mymat <- expand.grid(A, B, C, D)
    names(mymat) <- c("A", "B", "C", "D")
    mymat <- as.matrix(mymat)
    mymeans <- rowSums(mymat)/4
    write.table(mymat, file = paste("matrix", A, "txt", sep = "."))
    write.table(mymeans, file = paste("means", A, "txt", sep = "."))
    rm(mymat, mymeans)
}

それらをすべて取得します。それでも大きすぎる可能性があります。その場合は、ネストされたループを実行するか、ループオーバーすることができますD(最大であるため)。

あるいは、

n <- 1e7
A <- sample(133, size = n, replace= TRUE)
B <- sample(266, size = n, replace= TRUE)
C <- sample(266, size = n, replace= TRUE)
D <- sample(x = c(1:133, 267:400), size = n, replace= TRUE)
mymeans <- (A+B+C+D)/4

平均の大きなサンプルを提供し、まったく時間がかかりません。

hist(mymeans)
于 2012-12-13T00:44:09.437 に答える
1

順列と同じ大きさの平均のベクトルを作成しても、すべてのメモリを使い果たします。これをより小さな問題に分割し、オブジェクトをExcelに書き込んでから、ここでメモリからオブジェクトを削除することを調べます(両方ともSOで)。

これを行うためのコードについては、知識を「増やす」のが簡単になるように、できるだけシンプルにしようとしました。

#this is how to create vectors of sequential integers integers in R
a <- c(1:33)
b <- c(1:33)
c <- c(1:33)
d <- c(1:33,267:300)

#this is how to create an empty vector
means <- rep(NA,length(a)*length(b)*length(c)*length(d))
#set up for a loop
i <- 1

#how you run a loop to perform this operation
for(j in 1:length(a)){
    for(k in 1:length(b)){
        for(l in 1:length(c)){
            for(m in 1:length(d)){
                y <- c(a[j],b[k],c[l],d[m])
                means[i] <- mean(y)
                i <- i+1
            }
        }
    }
}

#and to graph your output
hist(means, col='brown')
#lets put a mean line through the histogram
abline(v=mean(means), col='white', lwd=2) 
于 2012-12-13T00:56:52.473 に答える