Lapply вместо цикла for в r

#r #loops #lapply

#r #циклы #lapply

Вопрос:

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

Rankall, который принимает два аргумента: имя результата (результат) и рейтинг больницы (число). Функция считывает csv-файл outcome-of-care-measures и возвращает фрейм данных из 2 столбцов, содержащий больницы в каждом штате, рейтинг которых указан в num.

 rankall <- function(outcome, num = "best") {
## Read outcome data
## Check that state and outcome are valid
## For each state, find the hospital of the given rank
## Return a data frame with the hospital names and the
## (abbreviated) state name
}

head(rankall("heart attack", 20), 10)
hospital state
AK <NA> AK
AL D W MCMILLAN MEMORIAL HOSPITAL AL
AR ARKANSAS METHODIST MEDICAL CENTER AR
4
AZ JOHN C LINCOLN DEER VALLEY HOSPITAL AZ
CA SHERMAN OAKS HOSPITAL CA
CO SKY RIDGE MEDICAL CENTER CO
CT MIDSTATE MEDICAL CENTER CT
DC <NA> DC
DE <NA> DE
FL SOUTH FLORIDA BAPTIST HOSPITAL FL
  

Моя функция работает правильно, но последний шаг (форматирование фрейма данных из 2 столбцов) Я сделал следующий цикл:

 new_data <- vector()
    for(i in sort(unique(d$State))){
        new_data <- rbind(new_data,cbind(d$Hospital.Name[which(d$State == i)][num],i))
    }
new_data <- as.data.frame(new_data)
  

Это правильно, но я знаю, что можно закодировать тот же цикл с помощью lapply функции

Моя попытка неверна:

 lapply(d,function(x) x <-rbind(x,d$Hospital.Name[which(d$State == i)][num]))
  

Как я могу это исправить?

Комментарии:

1. Что такое num ? Пожалуйста, покажите небольшой воспроизводимый пример

2. @akrun добавил, проверьте это еще раз, пожалуйста

3. Я думаю, что целью этого упражнения coursera было использование функций split and lapply .

Ответ №1:

Я предполагаю, что ваши d данные уже отсортированы:

 new_data <- do.call(rbind,
                    lapply(unique(d$State),
                           function(state){
                              data.frame(State = state,
                                         Hospital.Name = d$Hospital.Name[which(d$State==state)][num],
                                         stringsAsFactors = FALSE)
                       }))