2011-08-09 11 views
5

私はそこに華麗な心のための別の質問があります(このサイトはとても習慣性です)。空の行列にforループの結果を代入する

私は行列でいくつかのシミュレーションを実行しており、この目的のためにループ用にネストしています。最初は、ループが繰り返されるたびに1ずつ増加するベクトルを作成します。ネストされたループは、ベクトルをランダム化して行列に結びつけ、新しい行列の単純な性質を計算することによって、シミュレーションを実行しています。 (例では、シミュレーションでは変化しないプロパティを使用しましたが、実際にはランダム化されたベクトルの影響をよく知るためにはシミュレーションが必要です)。それらのシミュレーションの列手段。ここで

は、いくつかのサンプルコードです。

property<-function(mat){      #where mat is a matrix 
    a=sum(mat) 
    b=sum(colMeans(mat)) 
    c=mean(mat) 
    d=sum(rowMeans(mat)) 
    e=nrow(mat)*ncol(mat) 
    answer=list(a,b,c,d,e) 
    return(answer) 
    } 

x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4) 

obj=matrix(nrow=100,ncol=5,byrow=T)   #create an empty matrix to dump results into 

for(i in 1:ncol(x)){       #nested for loops 
    a=rep(1,times=i)        #repeat 1 for 1:# columns in x 
    b=rep(0,times=(ncol(x)-length(a)))   #have the rest of the vector be 0 
    I.vec=append(a,b)       #append these two for the I vector 
    for (j in 1:100){ 
     I.vec2=sample(I.vec,replace=FALSE)  #randomize I vector 
     temp=rbind(x,I.vec2) 
     prop<-property(temp) 
     obj[[j]]<-prop 
     } 
    write.table(colMeans(obj), 'myfile.csv', quote = FALSE, sep = ',', row.names = FALSE) 
    } 

私が遭遇しています問題は、ネストされたループの結果と空のオブジェクトのマトリックスに記入する方法です。 objは主にNAsのベクトルとして終わるので、結果を適切に割り当てていないことは明らかです。私は、各サイクルがobjに小道具の行を追加したいが、私は

obj[j,]<-prop 

をしようとするとRは、行列の添字の数が間違っていることを私に伝えます。

ありがとうございました!

EDITS: わかりましたので、ここでは以下の回答を再改良されたコードである:MYFILEは、4つの列(各列に1つだけ有していなければならないよう

property<-function(mat){      #where mat is a matrix 
    a=sum(mat) 
    b=sum(colMeans(mat)) 
    f=mean(mat) 
    d=sum(rowMeans(mat)) 
    e=nrow(mat)*ncol(mat) 
    answer=c(a,b,f,d,e) 
    return(answer) 
    } 

x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4) 

obj<-data.frame(a=0,b=0,f=0,d=0,e=0)   #create an empty dataframe to dump results into 
obj2<-data.frame(a=0,b=0,f=0,d=0,e=0) 

for(i in 1:ncol(x)){       #nested for loops 
    a=rep(1,times=i)        #repeat 1 for 1:# columns in x 
    b=rep(0,times=(ncol(x)-length(a)))   #have the rest of the vector be 0 
    I.vec=append(a,b)       #append these two for the I vector 
    for (j in 1:100){ 
     I.vec2=sample(I.vec,replace=FALSE)  #randomize I vector 
     temp=rbind(x,I.vec2) 
     obj[j,]<-property(temp) 
     } 
    obj2[i,]<-colMeans(obj) 
    write.table(obj2, 'myfile.csv', quote = FALSE, 
    sep = ',', row.names = FALSE, col.names=F, append=T) 
    } 

しかし、これは、依然としてグリッチでありますx)が、実際には10行あり、いくつかの繰り返しがあります。何か案は?

答えて

3

あなたproperty関数はリストを返しています。それはdata.frame(概念的に、より理にかなっている、ようにし、代わりに行列をするobjを定義する、また

property <- function(mat) 
{ 
    .... 
    c(a, b, c, d, e) # probably a good idea to rename your "c" variable 
} 

:あなたは行列に数値を格納する場合、あなたはそれが数値ベクトルを返す必要があります各列は異なる量を表す)。

obj <- data.frame(a=0, b=0, c=0, ...) 
for(i in 1:ncol(x)) 
    .... 
    obj[j, ] <- property(temp) 

最後に、write.tableへのお電話は、myfile.csvの内容が上書きされることに注意してください、それが含まれています唯一の出力は、iの最後の反復の結果です。

+0

素晴らしい!このアドバイスをありがとうございました。 – Laura

+0

"append = T"で追加して上書き問題を修正できます。 objは現在正常に動作していますが、write.tableを生成したファイルはまだ1つのカラムしかありません。私はobjのcolMeansを行として2番目の空のデータフレームを作成し、それをcsvファイルに書き込んでこれを修正しました。 – Laura

2

使用rbind

obj <- rbind(obj, prop) 
+1

それだけでは不十分ですが、助けてくれてありがとう! – Laura

関連する問題