Оператор IF вызывает неправильные результаты в функции - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь работать над заданием coursera в R. Мой код правильно работает для задания 1, где я пишу функцию в R для ранжирования больниц; в присвоении 2 я должен добавить несколько операторов IF или IF ELSE IF к уже записанной функции.

Функция дает окончательный фрейм данных.

  1. Входной аргумент IF num==best, функция возвращает первая строка последнего кадра данных
  2. Входной аргумент IF num==worst, функция возвращает последнюю строку конечного кадра данных
  3. Если входной аргумент num > max row count конечного кадра данных, функция возвращает NA
  4. Если входной аргумент num< max row count, функция возвращает эту строку из фрейма данных

Теперь оператор if работает правильно только для сценария 3 и 4. Для сценария 1 и 2 ios, он возвращает NA-, которое является возвращаемым значением сценария 3.

Что-то не так с тем, как я пишу операторы IF (это может быть последовательность, условие или что-то еще), из-за чего я получение возвращаемого значения NA для сценария 1,2

Код ниже, TIA

outcomeDF<-outcome[,c(2,7,n)]
names(outcomeDF)<-c("Hospital","State","Outcomess")
finalDF<-filter(outcomeDF,outcomeDF$State==sta)
     
DFSlist<-arrange(finalDF,finalDF$State,finalDF$Outcomess,finalDF$Hospital)

if (num > nrow(DFSlist)) print ("NA")
  else if (num < nrow(DFSlist)) c<-(DFSlist[num,])
  else if (num =="best")c<-(DFSlist[1,])
  else (num =="worst")c<-(DFSlist[(nrow(DFSlist)),])
return(c)

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вторая часть курса Университета Джона Хопкинса R Программирование задание курса 3 - это функция, называемая rankhospital().

Одна из причин, по которой код в исходном сообщении не работает, заключается в том, что он выполняет прямое сравнение между num и nrow(DFSlist). Когда num == "best" или num == "worst", первое условие в OP возвращает TRUE и возвращает NA вместо первой строки в кадре данных DFSlist.

Функция rankhospital() включает два позиционных аргумента, state, outcome и один именованный аргумент, num.

Данные для функции взяты из результатов измерений медицинской помощи в 2012 году в базе данных Hospital Compare, предоставленной Министерством здравоохранения США. Услуги.

Заготовка требуемой функции выглядит так.

rankhospital <- function(state, outcome, num="best") {
   # answer goes here
}

Функция должна делать три вещи, в том числе:

  1. Считывать результаты лечения в больнице data
  2. Проверка входных аргументов (например, проверка на недопустимое состояние, et c.)
  3. Обработка данных и возврат больницы n-го ранга в состоянии, указанном в state аргумент для одного из трех исходов (инфаркт, сердечная недостаточность или пневмония)

Вопрос в OP спрашивает, как использовать третий аргумент в функции num, чтобы получить лучший результат, Wor st или числовой c ранг.

После того, как данные были установлены в правильное состояние и отсортированы в соответствии с инструкциями, один из способов обработки аргумента num следующий:

# sort & subset here
 sortedSubset <- # code goes here, includes hospital, state, other variables
                 # sorted in required order (outcome then hospital name)

 # return hospital name, given num argument 
 if (num == "best") {
      return( sortedSubset[1,1]) 
 } else if (num == "worst") {
      return(sortedSubset[nrow(sortedSubset),1])
 } else if (as.numeric(num) > nrow(sortedSubset)) {
      return("NA")
 } else return (sortedSubset[as.numeric(num),1])

При правильной работе функция выдает следующие ответы на тестовые примеры, которые предоставляются с инструкциями по назначению.

> source("./rprogramming/rankhospital.R")
> rankhospital("TX","heart failure",4)
[1] "DETAR HOSPITAL NAVARRO"
> rankhospital("MD", "heart attack","worst")
[1] "HARFORD MEMORIAL HOSPITAL"
> rankhospital("MN","heart attack",5000)
[1] "NA"

ПРИМЕЧАНИЕ: Публикация полных решений для программных заданий. Специализация JHU Data Science является нарушением Кодекса чести Coursera. Поэтому я объясняю, где код OP нарушен, не публикуя полное решение для функции rankhospital().

0 голосов
/ 20 июня 2020

Вы пробовали заключать операторы if в фигурные скобки?

Кроме того, c() - это способ преобразования вещей в векторы, поэтому я настоятельно рекомендую не называть переменные c.

  # DF manipulation
  outcomeDF <- outcome[, c(2, 7, n)]
  names(outcomeDF) <-c("Hospital", "State", "Outcomess")
  finalDF <- filter(outcomeDF, outcomeDF$State==sta)
  DFSlist <- arrange(finalDF, finalDF$State, finalDF$Outcomess, finalDF$Hospital)

  # results logic
  if (num > nrow(DFSlist)) {
     print ("NA")
  } else if (num < nrow(DFSlist)) {
     res <-(DFSlist[num,])
  } else if (num =="best") {
     res <-(DFSlist[1,])
  } else {
     # (num =="worst") <- this doesn't seem to do anything
     res <-(DFSlist[(nrow(DFSlist)),])
    }

  return(res)

Кроме того, очищая ваш код, я обнаружил строку кода, которая сидела там и, вероятно, мешала вашим результатам. Это могло быть виновником.

Кроме того, num не определен для этого фрагмента кода, и у вас есть зависание }, о котором вы, вероятно, тоже знаете.

...