2016-09-30 3 views
1

rのforループのパフォーマンスを向上させる方法について少しお読みになりましたが、まだ140秒かかるもので止まっています。データ構造の事前割り振り後のR for-loopsのパフォーマンスを向上させます

私はコードを開始します:

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 


for (i in 1 : nrow(data.cleaned)) { 
    for (j in 1 : nrow(matrix)) { 

    if (data.cleaned$FO[i] == rownames(matrix)[j]) { 
     for (k in 1 : ncol(matrix)) { 

       if (data.cleaned$AK[i] == colnames(matrix)[k]) 
        {matrix[j,k] <- 1} 

     } 
    } 
    } 
} 

残念ながら、私は、任意の再現性の例を提供することはできません。そのdata.cleanedデータフレームは、約11000行を含むフレームです。各列には、FO(メインカテゴリ)とAK(FOのサブカテゴリ)(2つの異なる変数)の観測があります。

1つの行に対応するFOおよびAK観察がある場合、目標は1で塗りつぶし行列[i、j]です。

これは意味がありますか?
あなたがループに入る前に、あなたは

cnames.m <- colnames(matrix) 

を設定することができます。また、私は指定する必要があるかをより明確/より良い方法で

+1

に名前を付けることは良い考えではありませんベクトル化された関数などで置き換えようとします。 – snaut

+0

私の答えのコードがあなたのデータに必要な秒数は何秒ですか? – jogo

答えて

2

まずステップを記事を書くことができれば、コメントしてください。適切な場所で、あなたは

if (data.cleaned$AK[i] == cnames.m[k]) matrix[j,k] <- 1 

第2工程を行うことができます。
内側のループは

matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

と同一であるので、kでループする必要はありません。オブジェクト名に関する

matrix <- matrix(NA, length(register[,1]), length(AK), dimnames = list(register[,1], AK)) 

data.cleaned <- data[data$FO %in% register[,1],] 
rownames(data.cleaned) <- paste(1:nrow(data.cleaned)) 

cnames.m <- colnames(matrix) 
for (i in 1 : nrow(data.cleaned)) for (j in 1 : nrow(matrix)) 
    if (data.cleaned$FO[i] == rownames(matrix)[j]) matrix[j, data.cleaned$AK[i] == cnames.m] <- 1 

1の発言:
それ自体がRに非常にパフォーマンスではありません、ループのために行列matrix(?あなたは犬Dogに名前を付けます)

関連する問題