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?
Tuyệt vời! Cảm ơn tất cả những lời khuyên này. – Laura
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