2010-12-28 9 views
1

さらなる更新whileループについての質問R

データが作成されるため、入力はありません。

以下のコードは、最初の2人の患者のために動作しますが、私はループに入れたいです。最終的に200人の患者が存在する。長さは申し訳ありません。これまでのあなたの助けのために、追加情報を おかげで、ヨシュアを更新し

s <- 42 #SHOULD BE 42 
    p <- 30 #SHOULD BE 400 
    p1 <- 8 #Should be 8 
    m <- 2 #shou;ld be higher 
    w <- 2 
    #CAPITAL LETTERS are counting versions of the lowercase 
    numses <- 12 
    mult <- 1 
    maxses <- round(mult*numses,0) 
    drop = .3; titrate = .2; complete = .3; noise = .5; other = .1 
    dropskip = .3; titrateskip = .2; completeskip = .3; noiseskip = .5; otherskip = .1; 
    dropnew = .3; titratenew = .2; completenew = .9; noisenew = .5; othernew = .1; 
    name = "Basic"; 
    pdrop = .1; ptitrate = .2; pcomplete =.7; pnoise = .9; pother = 1; 

    # THESE HAVE TO BE ASCENDING. 
    w = 10 
    ###################################################################################################################### 

    patients <- matrix(nrow = p, ncol = s, "NA") #all patients attendance 
    invited <- matrix(nrow = p, ncol = s, 0) #number of sessions A or S 
    missinrow <- matrix(nrow = p, ncol = s, 0) #number of sessions missed in a row 
    insess <- vector("numeric", s) #number of people in a session 
    set.seed(83877201) 
    addlist <- rpois(s, w) 

# Set up waitlist 
waitlist <- vector("numeric", s) 
waitlist[1] <- addlist[1] 
for(i in 2:s) 
{ 
waitlist[i] <- waitlist[i-1] + addlist[i] 
} 
for (i in 1:p) 
{ 
    for (j in 1:s) 
    { 
    if (i < waitlist[j]) patients[i,j] <- "W" 
    } 
} 


#Assign all patients to classes 
classlist <- cut(runif(p), c(0, pdrop, ptitrate, pnoise, pcomplete, 1), labels = c("D", "T", "C", "N", "O")) 


#First patient 
#first session 
{ 
    invited[1,1] <- 1 
    insess[1] <- 1 
    if (classlist[1] == "D") 
    { 
     if (runif(1) < dropnew) {patients[1, 1] <- 'A'} else 
     { 
     patients[1, 1] <- 'S' 
     missinrow[1, 1] <- 1 
     } 
    } 
    if (classlist[1] == "T") 
    { 
     if (runif(1) < titratenew) {patients[1, 1] <- 'A'} else 
     { 
      patients[1, 1] <- 'S' 
      missinrow[1, 1] <- 1 
     } 
    } 
    if (classlist[1] == "C") 
    { 
     if (runif(1) < completenew) {patients[1, 1] <- 'A'} else 
     { 
     patients[1, 1] <- 'S' 
     missinrow[1, 1] <- 1 
     } 
    } 
    if (classlist[1] == "N") 
    { 
     if (runif(1) < noisenew) {patients[1, 1] <- 'A'} else 
     { 
     patients[1, 1] <- 'S' 
     missinrow[1, 1] <- 1 
     } 
    } 
    if (classlist[1] == "O") 
    { 
    if (runif(1) < othernew) {patients[1, 1] <- 'A'} else 
     { 
     patients[1, 1] <- 'S' 
     missinrow[1, 1] <- 1 
     } 
    } 
} 
#Later sessions 
for (j in 2 : s) 
{ 
    if (patients[1,(j-1)] == 'A'|patients[1,(j-1)] == 'S') 
    { 
     invited[1,j] <- invited[1,(j-1)] + 1 
    } else 
    { 
     invited[1,j] <- invited[1,(j-1)] 
    } 
     if (invited[1,j] <= maxses & missinrow[1,j] < m) 
    { 
    # Skip or attend 
    # If attended previous session  
     if (patients[1, (j-1)] == 'A') 
     { 
      if (classlist[1] == "D") 
      {if (runif(1) < drop) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- 1 
       } 
      } 
      if (classlist[1] == "T") 
      {if (runif(1) < titrate) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- 1 
       } 
      } 
      if (classlist[1] == "C") 
      {if (runif(1) < complete) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- 1 
       } 
      } 
      if (classlist[1] == "N") 
      { 
       if (runif(1) < noise) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- 1 
       } 
      } 
      if (classlist[1] == "O") 
      { 
       if (runif(1) < other) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- 1 
       } 
      }    
     } else 
     # If skipped previous session 
     if (patients[1, (j-1)] == 'S') 
     { 
      if (classlist[1] == "D") 
      { 
       if (runif(1) < drop) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- missinrow[1, (j-1)] + 1 
       } 
      } 
      if (classlist[1] == "T") 
      { 
       if (runif(1) < titrate) {patients[1, j] <- 'A'} else 
       { 
       patients[1, j] <- 'S' 
       missinrow[1, j] <- missinrow[1, (j-1)] + 1 
       } 
      } 
      if (classlist[1] == "C") 
      {if (runif(1) < complete) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- missinrow[1, (j-1)] + 1 
       } 
      } 
      if (classlist[1] == "N") 
      {if (runif(1) < noise) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- missinrow[1, (j-1)] + 1 
       } 
      } 
      if (classlist[1] == "O") 
      { 
       if (runif(1) < other) {patients[1, j] <- 'A'} else 
       { 
        patients[1, j] <- 'S' 
        missinrow[1, j] <- missinrow[1, (j-1)] + 1 
       } 
      }    
     } 
    } else {patients[1,j] <- 'D'} 
    # check for number of attended or missed sessions 
    if (patients[1,(j-1)] == 'A' | patients[1,(j-1)] == 'S') 
    { 
     insess[j] <- 1 
    } else 
    { 
     insess[j] <- 0 
    } 
} 


#Second patients 
#Patient is waiting and there is space 
    #First session 
if (insess[1] < maxses & waitlist[1] > 0) #THIS MAY NEED TO BE A WHILE LOOP, FOR MULTIPLE PATIENTS 
{ 
    invited[2,1] <- 1 
    insess[1] <- insess[1] + 1 
    if (classlist[2] == "D") 
    { 
     if (runif(1) < dropnew) {patients[1, 1] <- 'A'} else 
     { 
     patients[2, 1] <- 'S' 
     missinrow[2, 1] <- 1 
     } 
    } 
    if (classlist[2] == "T") 
    { 
     if (runif(1) < titratenew) {patients[2, 1] <- 'A'} else 
     { 
      patients[2, 1] <- 'S' 
      missinrow[2, 1] <- 1 
     } 
    } 
    if (classlist[2] == "C") 
    { 
     if (runif(1) < completenew) {patients[2, 1] <- 'A'} else 
     { 
     patients[2, 1] <- 'S' 
     missinrow[2, 1] <- 1 
     } 
    } 
    if (classlist[2] == "N") 
    { 
     if (runif(1) < noisenew) {patients[2, 1] <- 'A'} else 
     { 
     patients[2, 1] <- 'S' 
     missinrow[2, 1] <- 1 
     } 
    } 
    if (classlist[2] == "O") 
    { 
    if (runif(1) < othernew) {patients[2, 1] <- 'A'} else 
     { 
     patients[2, 1] <- 'S' 
     missinrow[2, 1] <- 1 
     } 
    } 
} 


    #Later sessions 


#Patient invited previous session 
for (j in 2 : s) 
{ 
    if (patients[2,(j-1)] == 'A'|patients[2,(j-1)] == 'S') 
    { 
     invited[2,j] <- invited[2,(j-1)] + 1 
    } else 
    { 
     invited[2,j] <- invited[2,(j-1)] 
    } 
     if (invited[2,j] <= maxses & missinrow[2,j] < m) 
    { 
    # Skip or attend 
    # If attended previous session  
     if (patients[2, (j-1)] == 'A') 
     { 
      if (classlist[2] == "D") 
      {if (runif(1) < drop) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- 1 
       } 
      } 
      if (classlist[2] == "T") 
      {if (runif(1) < titrate) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- 1 
       } 
      } 
      if (classlist[2] == "C") 
      {if (runif(1) < complete) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- 1 
       } 
      } 
      if (classlist[2] == "N") 
      { 
       if (runif(1) < noise) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- 1 
       } 
      } 
      if (classlist[2] == "O") 
      { 
       if (runif(1) < other) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- 1 
       } 
      }    
     } else 
     # If skipped previous session 
     if (patients[2, (j-1)] == 'S') 
     { 
      if (classlist[2] == "D") 
      { 
       if (runif(1) < drop) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- missinrow[2, (j-1)] + 1 
       } 
      } 
      if (classlist[2] == "T") 
      { 
       if (runif(1) < titrate) {patients[2, j] <- 'A'} else 
       { 
       patients[2, j] <- 'S' 
       missinrow[2, j] <- missinrow[2, (j-1)] + 1 
       } 
      } 
      if (classlist[2] == "C") 
      {if (runif(1) < complete) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- missinrow[2, (j-1)] + 1 
       } 
      } 
      if (classlist[2] == "N") 
      {if (runif(1) < noise) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- missinrow[2, (j-1)] + 1 
       } 
      } 
      if (classlist[2] == "O") 
      { 
       if (runif(1) < other) {patients[2, j] <- 'A'} else 
       { 
        patients[2, j] <- 'S' 
        missinrow[2, j] <- missinrow[2, (j-1)] + 1 
       } 
      }    
     } 
    } else {patients[2,j] <- 'D'} 
    # check for number of attended or missed sessions 
    if (patients[2,(j-1)] == 'A' | patients[2,(j-1)] == 'S') 
    { 
     insess[j] <- insess[j] + 1 
    } else 
    { 
     insess[j] <- insess[j] 
    } 
} 

ヨシュアはさらに助けることができるようにするために追加の情報を求めました。

全体的な問題は、治療の異なるセッションに出席した患者のデータセットを作成することです。彼らが出席するかどうかは、彼らはすでにどちらか参加したセッション数(classlistである)彼らは患者のどのような「クラス」(patientsである)前のセッションを、出席したかどうかを含め、多数のパラメータに依存します(invited)をスキップし、1行にいくつのセッションが欠落しているか(missinrow);それらのすべてが変わるでしょう。前回のセッションが満杯になっていない場合は、新しいセッションに追加の患者が割り当てられます(waitlist

私は一度にこの患者を務めるとうまくいきますが、すべての患者の上に、私はこれは、より大きなプログラムの一部である。私はそれが思った通りに動作しない理由を私は理解することはできません。コードは

for(i in 2:p) 
{ 
    while (insess[1] < maxses & waitlist[1] > 0) 
    { 
     invited[i,1] <- 1 
     waitlist[1] <- waitlist[1] - 1 
     insess[1] <- insess[1] + 1 
     if (classlist[i] == "D") 
     { 
     if (runif(1) < dropnew) {patients[i, 1] <- 'A'} else 
     { 
      patients[i, 1] <- 'S' 
      missinrow[i, 1] <- 1 
     } 
     } 
     if (classlist[i] == "T") 
     { 
      if (runif(1) < titratenew) {patients[i, 1] <- 'A'} else 
      { 
      patients[i, 1] <- 'S' 
      missinrow[i, 1] <- 1 
      } 
     } 
     if (classlist[i] == "C") 
     { 
      if (runif(1) < completenew) {patients[i, 1] <- 'A'} else 
      { 
      patients[i, 1] <- 'S' 
      missinrow[i, 1] <- 1 
      } 
     } 
     if (classlist[i] == "N") 
     { 
      if (runif(1) < noisenew) {patients[i, 1] <- 'A'} else 
      { 
      patients[i, 1] <- 'S' 
      missinrow[i, 1] <- 1 
      } 
     } 
     if (classlist[i] == "O") 
     { 
     if (runif(1) < othernew) {patients[i, 1] <- 'A'} else 
      { 
      patients[i, 1] <- 'S' 
      missinrow[i, 1] <- 1 
      } 
     } 
    } 
} 
ある

こんにちは

に実行します

これを実行すると、30になります(w私はまた、クラスリストに適切な値があることを確認しました。これは、クラスリストが適切な値を持っていることを確認しました。

ループからどこを離れるのかわかりません。私は誤って使用していると思うが、どうしたらよいかわからない。

ありがとうございました!

+0

いくつかのサンプルデータ(入力と出力)は非常に役立ちます。 –

+0

こんにちはJoshua - 入力がありません。データを作成することがポイントなので、私は患者ごとにデータを作成するプログラムを用意していますが、すべての患者のデータを作成するためにループに入れたいと思います。 –

答えて

5

あなたは、forループの各反復でinsess[1]waitlist[1]をリセットしていません。 i = 3,insess[1] = 10およびwaitlist[1] = 0の場合、whileループでは何も実行されません。

追加のボーナスとして、switch機能を使用するコードのより簡潔なバージョンを示します。

for(i in 2:p) 
{ 
    insess[1] <- INITME 
    waitlist[1] <- INITMETOO 

    while (insess[1] < maxses & waitlist[1] > 0) 
    { 
     invited[i,1] <- 1 
     waitlist[1] <- waitlist[1] - 1 
     insess[1] <- insess[1] + 1 

     newswitch <- 
     switch(classlist[i], 
       D = dropnew, 
       T = titratenew, 
       C = completenew, 
       N = noisenew, 
       O = othernew) 

     if (runif(1) < newswitch) { 
     patients[i, 1] <- 'A' 
     } else { 
     patients[i, 1] <- 'S' 
     missinrow[i, 1] <- 1 
     } 
    } 
} 
+0

ありがとう!私はそれに取り組んでいきます。それはそれを行う必要があります。 –

+0

@Peter Flom:if/elseブロックの読みやすいバージョンを追加しました(追加料金なし)。 –

+0

もっと見ると、私はあなたが正しいと思っていますが、私はそれについて何をすべきか分かりません。これはR(または他の言語)の私の最初の大きなプログラムです。 whileループを使用しないでください。または、ループの順序を変えるべきですか?>(また、答えでその灰色の強調表示をどうやって作っていますか?メインポストを作成するときはツールが表示されますが、ここでは表示されません)。再度、感謝します! –