Re: [问题] if elso loop不能接着执行?

楼主: Edster (Edster)   2014-10-29 00:21:18
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…
: 因为从没学过程式语言,只是自已想自修,没想到这么难…
: 另一个是小弟的程式码确实可以再精简,不过就等更熟了…
作者: nh2 (nh)   2014-10-29 12:17:00
感谢大大的教学!

Links booklink

Contact Us: admin [ a t ] ucptt.com