Re: [問題] if elso loop不能接著執行?

看板R_Language作者 (Edster)時間10年前 (2014/10/29 00:21), 10年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
best <- function(x, y){ z <- c("heart attack", "heart failure", "pneumonia") outcome <- read.csv(file="outcome-of-care-measures.csv", header=T, as.is=T) SS <- as.numeric(outcome[,11]) if (! (x %in% outcome$State) | ! (y %in% z)){ stop("Error in best(state, outcome) : invalid state") } if (y == "heart attack"){ select = outcome$State == x & !is.na(SS); o = order(SS) result <- outcome[o[select],c(1,2)] print(paste("best (", result, ") heart attack")) } } 邏輯是這樣, 沒事不要改 vector 的長度. 雖然可能會比較耗記憶體. 但是它不需要重新指定, 說不定也不會比較慢. 而且這樣寫起來乾淨一點, 我不知道你在不在意速度, 我比較在意半個月後還看得懂這個程式碼. 所以希望寫簡潔一點. 1. 讀csv用as.is就不會有 character 變成 factor 的問題. 所以改了 outcome[,11] 先變成 character 再轉成 numeric 的地方 2. 你的變數原先是寫 "x", 變數加了引號就變字串, 應該就直接寫變數 x 3. 我把你的 else if 刪了, 看起來沒有需要用到. 只有前面一個條件不滿足才需要 else if. 如果照你的 code: ! x %in% ...... 就沒了的話, 用 stop 更好. 硬是要放, 在這版本第二個 if 前放上 else 就好. 4. 篩選的部分, 這些篩選過程的 matrix 或是 data.frame 之後都沒有用到了 沒必要就不用創造他們. 用一維的 vector 就解決了. 5. 原先的 outcome_sel_order[[1,2]] 我猜你是要取某兩欄. 就改成 [,c(1,2)] 這樣. 看看. 說不定還有錯. ※ 引述《nh2 (nh)》之銘言: : [問題類型]: : : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : : [軟體熟悉度]: : 請把以下不需要的部份刪除 : 新手(沒寫過程式,R 是我的第一次) : : [問題敘述]: : 其實這是coursera course的作業三,想要讀入資料後,先看州名和outcome : 名符不符合,不符合顯示error,符合則顯示outcome最好的醫院 : [程式範例]: : best <- function(x, y){ : z <- c("heart attack", "heart failure", "pneumonia") : ##read oucome data : outcome <- read.csv(file="outcome-of-care-measures.csv", header=T) : outcome[,11] <- as.numeric(as.character(outcome[,11])) : ## check if state and outcome are valid : if (! ("x" %in% outcome$State)){ : print("Error in best(state, outcome) : invalid state") : } else if (! ("y" %in% z)){ : print("Error in best(state, outcome) : invalid state") : } else if ("y" == "heart attack"){ : ##return name with lowest 30 day death : outcome_select <- subset(outcome, outcome$State == "x") : outcome_sel_clean <-outcome_select[!is.na(outcome_select[,11]),] ## : remove NA : M_order <- order(outcome_sel_clean[,11]) ##establish order : outcome_sel_order <- outcome_sel_clean[M_order,] ## order as new order : result <- paste(outcome_sel_order[[1,2]], "heart attack", sep =",") : print(paste("best (", result, ")")) : } : 接下來的程式碼差不多,但是不管x輸入哪個值,就算州名正確,也是跑出error… : 因為從沒學過程式語言,只是自已想自修,沒想到這麼難… : 另一個是小弟的程式碼確實可以再精簡,不過就等更熟了… -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.127.66 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1414513281.A.E41.html ※ 編輯: Edster (114.24.127.66), 10/29/2014 00:22:14 ※ 編輯: Edster (114.24.127.66), 10/29/2014 00:22:40 ※ 編輯: Edster (114.24.127.66), 10/29/2014 00:29:49 ※ 編輯: Edster (114.24.127.66), 10/29/2014 02:32:13

10/29 12:17, , 1F
感謝大大的教學!
10/29 12:17, 1F
※ 編輯: Edster (140.112.64.48), 10/29/2014 14:10:09
文章代碼(AID): #1KJyA1v1 (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1KJyA1v1 (R_Language)