2011-08-09 5 views
5

멋진 마음을 가진 다른 질문이 있습니다 (이 사이트는 중독성이 있습니다).for 루프의 결과를 빈 행렬에 할당

매트릭스에서 일부 시뮬레이션을 실행 중이며이 목적을 위해 루프를 중첩했습니다. 첫 번째는 루프가 순환 할 때마다 하나씩 증가하는 벡터를 만듭니다. 중첩 루프는 벡터를 무작위 화하여 행렬에 연결하고 새 행렬에서 간단한 속성을 계산하여 시뮬레이션을 실행합니다. (예를 들어, 시뮬레이션에서 달라지지 않을 속성을 사용했지만 실제로는 무작위로 지정된 벡터의 영향에 대한 좋은 아이디어를 얻기 위해 시뮬레이션이 필요합니다.) 중첩 루프는 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) 
    } 

I가 발생하고 문제가 중첩 된 루프의 결과에 빈 객체 행렬을 작성하는 방법은 다음과 같습니다

는 여기에 몇 가지 예제 코드입니다. obj는 대부분 NAs의 벡터로 끝나기 때문에 결과를 올바르게 할당하지 않는다는 것이 확실합니다. 나는 각각의 사이클은 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을 전용의 각 열에 대해 (하나의 4 개 개의 행을 가져야 같이 여전히 glitchy이고 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의 내용을 덮어 않습니다, 그래서이 포함됩니다 유일한 출력은 난의 마지막 반복의 결과이다.

+0

환상적! 이 모든 조언에 감사드립니다. – Laura

+0

"append = T"를 추가하여 덮어 쓰기 문제를 해결할 수 있습니다. obj가 제대로 작동하지만 write.table 파일은 여전히 ​​하나의 열이었습니다. obj의 colMeans를 행으로 사용하여 두 번째 빈 데이터 프레임을 만든 다음이를 csv 파일에 작성하여이 문제를 해결했습니다. – Laura

2

사용 rbind는 :

obj <- rbind(obj, prop) 
+1

그 자체로 충분하지 않지만 도움을 주셔서 감사합니다. – Laura