У меня есть еще один вопрос для блестящих умов (этот сайт настолько затягивает).
Я провожу некоторые симуляции на матрице и для этой цели вложил в циклы.Первый создает вектор, который увеличивается на единицу каждый раз при цикле цикла.Вложенный цикл выполняет моделирование, рандомизируя вектор, присоединяя его к матрице и вычисляя некоторые простые свойства для новой матрицы.(Например, я использовал свойства, которые не будут меняться в симуляциях, но на практике мне требуются симуляции, чтобы получить хорошее представление о влиянии рандомизированного вектора.) Вложенный цикл выполняет 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 заканчивается как вектор в основном NA, поэтому ясно, что я не присваиваю результаты должным образом.Я хочу, чтобы каждый цикл добавлял строку проп в obj, но если я попытаюсь
obj[j,]<-prop
R скажет мне, что в матрице указано неверное количество индексов.
Спасибобольшое за вашу помощь!
РЕДАКТИРОВАТЬ: Хорошо, так вот улучшенный код ответов ниже:
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 строк, причем некоторые повторяются.Есть идеи?