2016-07-19 2 views
1

Я сейчас занимаюсь курсом программирования Intro to R на Coursera, и у меня есть следующие сомнения в моем коде. Ниже приведен фрагмент кода.Разница между уникальными и уровнями и использование suppresswarnings

rankall <- function(outcome, num = "best") { 

    ## Read outcome data 
    dat <- read.csv("outcome-of-care-measures.csv") 





## Check that outcome are valid 
    outcomeValues <- c("heart attack", "heart failure", "pneumonia") 

    if(!(outcome %in% outcomeValues)){ 
    stop("invalid outcome") 


    } 

    column <- if(outcome == "heart attack"){ 
    11 
    } 
    else if(outcome == "heart failure"){ 
    17 
    } 
    else if(outcome == "pneumonia") { 
    23 
    } 

    dat[, column] <- suppressWarnings(as.numeric(levels(dat[, column])[dat[, column]])) 
    dat[, 2] <- as.character(dat[, 2]) 
    dat[, 11] <- as.numeric(dat[, 11]) # heart attack 
    dat[, 17] <- as.numeric(dat[, 17]) # heart failure 
    dat[, 23] <- as.numeric(dat[, 23]) # pneumonia 
    output <- vector() 
    states <- levels(dat[, 7]) 

    ## Return hospital name in that state with lowest 30-day death rate 
    ## For each state, find the hospital of the given rank 
    for(i in 1:length(states)){ 




stateData <- dat[grep(states[i], dat$State), ] 
    outcomeData <- stateData[order(stateData[, column], stateData[, 2], na.last = NA), ] 
    hospital <- if(num == "best" || num == 1){ 
    outcomeData[1, 2] 
    } 
    else if(num == "worst") { 
    outcomeData[nrow(outcomeData), 2] 
    } 
    else { 
    outcomeData[num, 2] 
    } 
    result <- append(result, c(hospital, states[i])) 
    } 




## Return a data frame with the hospital names and the (abbreviated) state name 
    result <- as.data.frame(matrix(result, nrow = length(states), ncol = 2, byrow = TRUE)) 
    colnames(result) <- c("Hospital names", "State") 


    result 
    } 

В приведенном выше коде, если я заменю states <- levels(dat[, 7]) по states <- unique(dat[,7]), я не получаю правильные выводы. Я не понимаю, почему.

А также, если я вниз

dat[, column] <- suppressWarnings(as.numeric(levels(dat[, column])[dat[, column]])) 

Мой код не генерирует правильные выводы. Я попытался подтянуть документацию suppresswarnings, но либо я пропустил точку где-то, либо я не смог найти правильный ответ нигде.

+0

Вы могли бы 'dput (head (dat))' пожалуйста? Это упростит выполнение вашего кода. –

ответ

2

Поскольку столбец фактор может иметь больше уровней, чем фактические значения и т.д .:

x <- factor(1:3, levels = 1:4) 
x 
# [1] 1 2 3 
# Levels: 1 2 3 4 

unique(x) 
# [1] 1 2 3 
# Levels: 1 2 3 4 
length(unique(x)) 
# [1] 3 

levels(x) 
# [1] "1" "2" "3" "4" 
length(levels(x)) 
# [1] 4 

Это полезно, когда позже мы хотим, чтобы добавить значение «4» х.