Функция, которая выбирает минимальное значение в столбце, не является минимальной, и, скорее всего, это связано с тем, что столбец является фактором, а не числом? - PullRequest
1 голос
/ 15 октября 2019

Набор данных, системные настройки, функция, описание и результат следующие:

Если ввести AK вручную для choice, а затем проверить stateOfChoice и посмотреть под 30 day mortality by pneumonia, можно найтичисловые значения больниц, поэтому результат должен быть YUKON KUSKOKWIM DELTA REG HOSPITAL, поскольку он имеет наименьшее значение в ~ 9,5. Тем не менее, я получаю PROVIDENCE ALASKA MEDICAL CENTER. Заполнены все значения 30-дневной смертности от пневмонии в данном штате. Тем не менее, это фактор класса. Этот неправильный тип класса вполне может быть проблемой, почему YUKON HOSPITAL не появляется в результатах. Что можно сделать, чтобы решить проблему наличия другого выбора больницы для 30-дневной смертности от пневмонии?

Системными настройками являются Windows 10 и R 3.6.1

Исходный набор данных.

Набор данных со всеми значениями для 30-дневной смертностиОцените заполненную пневмонию.

Используемый вызов функции:

best("AK","pneumonia")

Функция:

best <- function(state, outcome) {
     #read file function

  #Reads the csv file
  dataTable  <- read.csv("outcome.csv", header = TRUE)

  #Passes the state argument to the choice variable
  choice <- state
  #selects all rows which match the state that was selected
  stateOfChoice <- dataTable[dataTable$State == choice,]
  stateOfChoice

  #Makes sure that only three of outcomes found in the csv file are selected
  if(outcome != "heart failure" && outcome != "heart attack" && outcome != "pneumonia"){
    print("wrong condition, try again")
    main()
  }

  #using the selected rows from above, return the minimum value of rate from heart attack and then use this selected row to find the hospital name
  else if (outcome == "heart attack"){


    heart_attack <- stateOfChoice[which.min(stateOfChoice$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack),]
    heart_attack
    hospital <- heart_attack$Hospital.Name
    hospital
    return(hospital)
  }

  #Similar as above, but instead with heart failure
  else if (outcome == "heart failure"){
    heart_failure <- stateOfChoice[which.min(stateOfChoice$Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure),]
    hospital <- heart_failure$Hospital.Name
    return(hospital)
  }

  #Similar as above, but instead with pneumonia
  else if (outcome == "pneumonia"){


    pneumonia <- stateOfChoice[which.min(stateOfChoice$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia),]
    pneumonia
    hospital <- pneumonia$Hospital.Name
    return(hospital)
  }

}

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Ваши числовые столбцы в файле данных имеют слова «Недоступно» в некоторых ячейках, поэтому читаются как символ или фактор. Поэтому which.min возвращает первое значение в алфавитном, а не в числовом виде.

Чтобы решить эту проблему, для каждого из ваших столбцов X, в которых вы хотите использовать числовые функции, сначала выполните это ...

stateOfChoice$X <- as.numeric(as.character(stateOfChoice$X))

Преобразование из фактора в числовое значение можно выполнить только в качестве промежуточного шага, используя символ.

0 голосов
/ 15 октября 2019

Проблема именно в том, что вы заявили - ваш столбец Hospital.Name является фактором, который означает, что строки закодированы как числа, которые отбрасывают вашу функцию which.min. Вам просто нужно добавить stringsAsFactors = FALSE к вашей функции read.csv, чтобы это исправить.

dataTable  <- read.csv("outcome.csv", header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...