2011-08-09 26 views
5

Tôi có một câu hỏi khác cho những suy nghĩ sáng chói ngoài kia (trang này rất gây nghiện).Gán các kết quả của vòng lặp for cho một ma trận trống

Tôi đang chạy một số mô phỏng trên ma trận và tôi đã lồng nhau cho các vòng lặp cho mục đích này. Việc đầu tiên tạo ra một vectơ tăng mỗi lần một chu kỳ vòng lặp. Vòng lặp lồng nhau đang chạy mô phỏng bằng cách ngẫu nhiên vectơ, gắn nó vào ma trận và tính toán một số thuộc tính đơn giản trên ma trận mới. (Ví dụ, tôi đã sử dụng các thuộc tính sẽ không thay đổi trong các mô phỏng, nhưng trong thực tế, tôi yêu cầu các mô phỏng để có được ý tưởng tốt về tác động của vector ngẫu nhiên.) Vòng lặp lồng nhau chạy 100 mô phỏng, và cuối cùng tôi chỉ muốn cột của các mô phỏng đó.

Dưới đây là một số mã ví dụ:

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

Vấn đề tôi gặp phải là làm thế nào để điền vào ma trận đối tượng rỗng với kết quả của các vòng lặp lồng nhau. obj kết thúc như là một vector của hầu hết các NA, vì vậy rõ ràng là tôi không chỉ định kết quả đúng cách. Tôi muốn mỗi chu kỳ thêm hàng chống đỡ vào obj, nhưng nếu tôi thử

obj[j,]<-prop 

R cho tôi biết có số lượng không chính xác các bảng con trên ma trận.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn!

CHỈNH SỬA: Được rồi, vì vậy đây là mã được cải tiến lại các câu trả lời dưới đây:

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

Tuy nhiên, điều này vẫn còn trục trặc, như myfile chỉ nên có bốn hàng (một cho mỗi cột x), nhưng thực sự có 10 hàng, với một số lặp lại. Bất kỳ ý tưởng?

Trả lời

3

chức năng property bạn đang trả lại một danh sách. Nếu bạn muốn lưu trữ các số trong một ma trận, bạn nên có nó trả về một vector số:

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

Ngoài ra, thay vì quy định obj trở thành một ma trận, làm cho nó một data.frame (mà khái niệm có ý nghĩa hơn, như mỗi cột đại diện cho một số lượng khác nhau).

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

Cuối cùng, lưu ý rằng cuộc gọi của bạn để write.table sẽ ghi đè lên nội dung của myfile.csv, vì vậy sản lượng chỉ nó sẽ chứa là kết quả cho lần lặp cuối cùng của tôi.

+0

Tuyệt vời! Cảm ơn tất cả những lời khuyên này. – Laura

+0

Tôi có thể khắc phục sự cố ghi đè bằng cách thêm vào "append = T". obj hoạt động đúng lúc, nhưng tập tin được tạo ra write.table vẫn chỉ là một cột. Tôi cố định điều này bằng cách tạo một dataframe trống thứ hai với colMeans của obj như các hàng và sau đó đã viết nó vào một tệp csv. – Laura

2

Sử dụng rbind:

obj <- rbind(obj, prop) 
+1

Không đủ, nhưng cảm ơn sự giúp đỡ của bạn! – Laura

Các vấn đề liên quan