2014-02-25 5 views
1

저는 시뮬레이션을하고 있으며, 특히 Ao라는 제목의 열에 반복적으로 오류를 추가하려고합니다. 출력 결과 처음 30 행은 정확합니다. 초기 데이터, 변경된 데이터의 첫 해 (Ao에 오류가 추가됨)가 있었지만 나중에 30 년 동안 오류가 추가되기를 원하면 Ao에 대해 Year 30까지 반복됩니다. 내 목표 매년 샘플링 한 후에 오류가 추가됩니다. 예. 2 학년은 AO + 1 학년입니다. 3 학년은 Year 2 Ao + 오류입니다. 어떤 도우미? 건배.루프의 열에 rnorm을 추가하십시오.

for(t in 1:30){ 
     Error<-rnorm(1000,0,1) 
     m<-rep(year1data$m,30) 
     r<-rep(year1data$r,30) 
     a<-rep(year1data$a,30) 
     g<-rep(year1data$g,30) 
     Year<-rep(2:31, each=TotSpecies) 
     Species<-1:TotSpecies 
     Ao<-year1data$Ao+sample(Error,TotSpecies,replace=FALSE) 
     TotSpeciesdata<-data.frame(Species,Year,Ao,m,r,a,g) 
     TotSpeciesdata<-rbind(year1data,TotSpeciesdata) 
    } 

    > TotSpeciesdata 
    Species Year   Ao m   r   a   g 
    1   1 1 25.770783 43 119.110786 3.2305180 2.6526471 
    2   2 1 53.908914 138 161.894541 0.7342070 0.1151602 
    3   3 1 2.010732 226 193.820489 2.2890904 3.6248105 
    4   4 1 23.742254 332 17.315335 1.4009572 2.0037931 
    5   5 1 4.291080 63 187.591209 0.2563995 2.1553908 
    6   6 1 4.691113 343 116.267867 0.3899113 3.3950085 
    7   7 1 604.133044 224 132.240197 3.0410743 0.7985524 
    8   8 1 13.332567 166 5.367118 0.7921644 1.7861011 
    9   9 1 3.759268 141 212.340970 2.8733737 2.7123141 
    10  10 1 3.647390 209 259.400858 0.1249936 0.6594659 
    11  11 1 23.731109 10 114.171147 2.2437372 0.9867591 
    12  12 1 85.116996 69 167.412993 0.8306823 2.8905148 
    13  13 1 31.684280 277 177.025460 2.7618332 2.9245554 
    14  14 1 30.657523 205 21.710438 2.7661347 1.5911379 
    15  15 1 12.240410 85 210.121109 2.8827455 3.0418454 
    16  1 2 27.038097 43 119.110786 3.2305180 2.6526471 
    17  2 2 54.251600 138 161.894541 0.7342070 0.1151602 
    18  3 2 2.010636 226 193.820489 2.2890904 3.6248105 
    19  4 2 22.699369 332 17.315335 1.4009572 2.0037931 
    20  5 2 4.542589 63 187.591209 0.2563995 2.1553908 
    21  6 2 3.607833 343 116.267867 0.3899113 3.3950085 
    22  7 2 604.480756 224 132.240197 3.0410743 0.7985524 
    23  8 2 13.663513 166 5.367118 0.7921644 1.7861011 
    24  9 2 2.138715 141 212.340970 2.8733737 2.7123141 
    25  10 2 3.642769 209 259.400858 0.1249936 0.6594659 
    26  11 2 22.897993 10 114.171147 2.2437372 0.9867591 
    27  12 2 85.490897 69 167.412993 0.8306823 2.8905148 
    28  13 2 31.689202 277 177.025460 2.7618332 2.9245554 
    29  14 2 30.644419 205 21.710438 2.7661347 1.5911379 
    30  15 2 12.050207 85 210.121109 2.8827455 3.0418454 
    31  1 3 27.038097 43 119.110786 3.2305180 2.6526471 
    32  2 3 54.251600 138 161.894541 0.7342070 0.1151602 
    33  3 3 2.010636 226 193.820489 2.2890904 3.6248105 
    34  4 3 22.699369 332 17.315335 1.4009572 2.0037931 
    35  5 3 4.542589 63 187.591209 0.2563995 2.1553908 
    36  6 3 3.607833 343 116.267867 0.3899113 3.3950085 
    37  7 3 604.480756 224 132.240197 3.0410743 0.7985524 
    38  8 3 13.663513 166 5.367118 0.7921644 1.7861011 
    39  9 3 2.138715 141 212.340970 2.8733737 2.7123141 
    40  10 3 3.642769 209 259.400858 0.1249936 0.6594659 
    41  11 3 22.897993 10 114.171147 2.2437372 0.9867591 
    42  12 3 85.490897 69 167.412993 0.8306823 2.8905148 
    43  13 3 31.689202 277 177.025460 2.7618332 2.9245554 
    44  14 3 30.644419 205 21.710438 2.7661347 1.5911379 
    45  15 3 12.050207 85 210.121109 2.8827455 3.0418454 
+1

스택 오버 플로우에 오신 것을 환영합니다! 'dput'을 사용하여 데이터를 [재현 가능한 형식] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)으로 제공하십시오. 또한 당신이 원하는 것이 불분명합니다. 의도 한 출력 예를 제공하는 것을 고려하십시오. – Thomas

답변

4

당신이 당신의 접근 방식이 가장 큰 문제는 라인 : Year30 * TotSpecies 벡터이다

TotSpeciesdata<-data.frame(Species,Year,Ao,m,r,a,g) 

때문에, 그러나 모든 다른 사람은 TotSpecies 길다. 따라서 사실상 데이터 프레임을 만들 때 Year을 제외한 모든 열을 30 번 재활용하면 2 년 데이터가 30 번 반복됩니다. 만약 당신이 단지 Year <- rep(i + 1, TotSpecies)을 가지고 있다면 나는 당신의 논리가 잘 작동 할 것이라고 생각합니다. 즉 여기에 다른 접근 방식 말했다

이 뜻은, 각 종 5 년 동안 그 종족에 대한 Ao로 시작하는 증가 랜덤 워크 (random walk)를 작성 (그랬던 그 표시 목적으로) :

set.seed(1) 
year1data <- data.frame(species=1:10, year=1, Ao=runif(10, 1, 700)) 
TotSpeciesData <- do.call(
    rbind, 
    lapply(
    split(year1data, year1data$species), 
    function(data) 
     with(
     data, 
     data.frame(species=species, year=year, Ao=c(Ao, Ao + cumsum(rnorm(5))) 
)))) 
head(TotSpeciesData, 15) 

참고 칼럼은 특정 질문과 직접적으로 관련이 없기 때문에 제외되었지만 상대적으로 쉽게 추가 할 수 있습니다. 또한 단지 그래서 당신이 여기에 결과를 볼 수 있지만 그 변경도 용이하다 1 년에 추가로 오년했다 :

species year  Ao 
1.1  1 1 186.5906 
1.2  1 1 185.7701 
1.3  1 1 186.2575 
1.4  1 1 186.9958 
1.5  1 1 187.5716 
1.6  1 1 187.2662 
2.1  2 1 261.1146 
2.2  2 1 262.6264 
2.3  2 1 263.0162 
2.4  2 1 262.3950 
2.5  2 1 260.1803 
2.6  2 1 261.3052 
3.1  3 1 401.4245 
3.2  3 1 401.3796 
3.3  3 1 401.3634 
+0

많은 도움을 받았습니다. 첫 번째 팁 : Year <-rep (i + 1, TotSpecies)는 작동하지 않지만 필요한 항목을 대체 할 수 있도록 조정할 수있었습니다. 매우 감사! – KL2014

+0

제공된 코드가 제대로 작동하지 않는 것 같습니다. 아래 내 의견을 참조하십시오. – KL2014

0

그것은 지적되었다 당신이 위의 제공, 또는 적어도 코드 내가 편집 한 것은 단계적인 방식으로 고유 한 해가되기보다는 매 15 년마다 반복됩니다. I는 아래와 같이 편집 :

TotSpeciesData <- do.call(
    rbind, #bind the table by rows 
    lapply( #applying the function in list form 
    split(year1data, year1data$Species), #splits data into groups by species 
    function(data) 
     with(
     data, 
     data.frame(Species=Species, Year=1:Community, Ao=c(Ao, Ao + cumsum(rnorm((TotSpecies-1),0,2))),m=m, r=r, a=a, g=g) #data frame is Species, Year, 
     ))) 
    TotSpeciesData$Ao[TotSpeciesData$Ao<0]<-0     #any values less than 0 go to 0 
TotSpeciesData<-TotSpeciesData[order(TotSpeciesData$Year),] #orders the data frame by Year 

I이 코드를 수행 할 때

TotSpeciesData[TotSpeciesData$Species==1 & TotSpeciesData$Year %in% c(1,2,16,17),] 

I 데이터가 되풀이되는 것을 나타내는 출력을 끝낸다.

Species Year  Ao m  r  a  g 
1.1  1 1 48.49161 239 332.9625 3.791778 2.723104 
1.2  1 2 49.62851 239 332.9625 3.791778 2.723104 
1.16  1 16 48.49161 239 332.9625 3.791778 2.723104 
1.17  1 17 49.62851 239 332.9625 3.791778 2.723104 

의견이 있으십니까?

+0

'Year'와'Ao' 벡터가 같은 길이인지 확인해야합니다. 데이터가 없으면 확실하지 않지만 Ao = c (Ao, Ao + cumsum (rnorm ((Community-1), 0,2)))')'('TotSpecies'를'Community ')와 같은 방식으로'Year'와'Ao' 벡터가 같은 길이로 끝납니다. – BrodieG

관련 문제