Как мне установить столбцы в данных - PullRequest
0 голосов
/ 02 мая 2020

rankhospital <- function(state = factor(), outcome = factor(), num = factor()) {
        #read data
        caremeasures <- read.csv("D:/data science specialization/course stuff/rprogw3/outcome-of-care-measures.csv", na.strings = "NA", stringsAsFactors = FALSE)
        
        
        #separate required columns
        requiredOutcomes <- caremeasures[11, 17, 23]
        
        #assign columns names
        names(requiredOutcomes[3]) <- "heart attack"
        names(requiredOutcomes[4]) <- "heart failure"
        names(requiredOutcomes[5]) <- "pneumonia"
        
         
        arrangedData <- order(requiredOutcomes[caremeasures$State == state, c(caremeasures$Hospital.Name, outcome)])
        
        if (num == "best"){
            result <- arrangedData[1, 1]
            return(result)
                
                
        }
        else if (num == "worst"){
            result <- arrangedData[nrow(arrangedData[,1]),1]
            return(result)
            
        }
        else 
            result <- arrangedData[num, 1]
            return(result)
}       

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

Error in requiredOutcomes[caremeasures$State == state, c(caremeasures$Hospital.Name,  : 
  incorrect number of dimensions

1 Ответ

0 голосов
/ 02 мая 2020

У меня нет ваших данных, поэтому я спроецирую то, что, по моему мнению, ведет к проблеме.

Ссылка на caremeasures[11, 17, 23], вероятно, не делает то, что вам нужно, и поэтому возвращать то, чего вы не ожидаете. Попробуйте с caremeasures[,c(11, 17, 23)].

Я постараюсь показать, что происходит, используя mtcars:

requiredOutcomes <- mtcars[1,2,3]
requiredOutcomes
# [1] 6
requiredOutcomes[1,2]
# Error in requiredOutcomes[1, 2] : incorrect number of dimensions

Поскольку mtcars - это data.frame, ваш [ индексирование использует [.data.frame под капотом. Это переводит что-то вроде

# equivalent
mtcars[1, 2]
`[.data.frame`(mtcars, 1, 2)

«Аргументы» (да, это просто обычная функция):

str(formals(`[.data.frame`))
# Dotted pair list of 4
#  $ x   : symbol 
#  $ i   : symbol 
#  $ j   : symbol 
#  $ drop: language if (missing(i)) TRUE else length(cols) == 1

, что означает, что ваши 11, 17, 23 аргументы фактически

`[.data.frame`(requireOutcomes, 11, 17, 23)

, который применяется к аргументам как

`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = 23)

Хорошо, поэтому x= имеет смысл (данные). i= дает выбор строки (11), а j= - выбор столбца. Однако, когда R ожидал logical, тогда все, что не равно нулю, считается TRUE, так что это фактически

`[.data.frame`(x = requireOutcomes, i = 11, j = 17, drop = TRUE)

, которое полностью теряет ваши намерения (я подозреваю), возвращая скаляр (одно значение, вектор длины 1 в R). Примечание: если бы вы использовали 0 или FALSE, вы бы вернули data.frame с 1 строкой и 1 столбцом.

Вот метод для отладки того, что происходит, чтобы вы могли найди это для себя в следующий раз.

myfunc <- function(x) {
  res <- x[1,2,3]
  return(res[1:3,])
}
myfunc(mtcars)
# Error in res[1:3, ] (from #3) : incorrect number of dimensions

Хорошо, мы видим ту же ошибку. Мы будем использовать debug(myfunc) (независимо от того, как называется ваша функция), хотя вы можете добиться аналогичных результатов, поместив browser() в определенное c место в вашей функции.

debug(myfunc)
myfunc(mtcars)
# debugging in: myfunc(mtcars)
# debug at #1: {
#     res <- x[1, 2, 3]
#     return(res[1:3, ])
# }
# Browse[2]> 

Мы сейчас в отладчике R, что дает нам отслеживание выполнения шага. Ввод n выполняет строку n ext; Вы можете прочитать больше команд с помощью ?browser.

n
# debug at #2: res <- x[1, 2, 3]
# Browse[2]> 
n
# debug at #3: return(res[1:3, ])
# Browse[2]> 
res
# [1] 6

(«debug at» показывает следующую строку, которая будет выполнена, поэтому мы еще не выполнили return(...). С этим мы можем видеть, что res - который мы считаем data.frame - это просто одно число. Да. Теперь посмотрите на код и выясните, что произошло. Для меня (и в этом простом примере) это явно x[1,2,3], это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...