2011-08-09 134 views
5

我還有另外一個關於那裏的精彩頭腦的問題(這個網站很容易讓人上癮)。將for循環的結果賦值給一個空矩陣

我正在矩陣上運行一些模擬,並且爲此嵌套了循環。第一個創建一個向量,每次循環循環時增加1。嵌套循環通過隨機化矢量,將其附加到矩陣並計算新矩陣上的一些簡單屬性來運行仿真。 (例如,我使用的屬性在仿真中不會改變,但實際上我需要仿真來了解隨機向量的影響。)嵌套循環運行100次仿真,最終我只需要這些模擬的列方式。

下面是一些示例代碼:

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: 好了,所以這裏再下面的答案改進代碼:

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

然而,這仍然是出問題的,因爲myfile的應該只有四排(一個用於每列x),但實際上有10行,有些重複。有任何想法嗎?

回答

3

property函數返回一個列表。如果你想的數字存儲在一個矩陣,你應該有它返回一個數字矢量:

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

或者,而不是定義obj是一個矩陣,使之成爲data.frame(這在概念上更有意義,因爲每列表示不同的數量)。

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

最後請注意,你給write.table通話將覆蓋的myfile.csv的內容,因此它將包含唯一的輸出是我的最後一次迭代的結果。

+0

太棒了!謝謝你的所有建議。 – Laura

+0

我可以通過添加「append = T」來解決覆蓋問題。 obj現在可以正常工作,但生成write.table的文件仍然只有一列。我通過創建第二個空數據框,以obj的colMeans作爲行來解決此問題,然後將其寫入一個csv文件。 – Laura

2

使用rbind

obj <- rbind(obj, prop) 
+1

本身不夠,但感謝您的幫助! – Laura