【问题标题】:Lapply instead of for loop in rLapply 而不是 r 中的 for 循环
【发布时间】:2016-10-05 11:19:52
【问题描述】:

我想写一个函数,它返回一个 2 列数据框 包含在 num 中指定排名的每个州的医院。

Rankall 采用两个参数:结果名称(结果)和医院排名 (数量)。该函数读取结果-of-care-measures.csv 文件并返回一个 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]))

我该如何解决这个问题?

【问题讨论】:

  • 什么是num?请展示一个可重现的小例子
  • @akrun 已添加,请再次查看
  • 我认为这个 coursera excersice 的目的是使用 split 和 lapply 函数。

标签: r loops 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)
                       }))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2018-12-05
    • 2020-07-13
    相关资源
    最近更新 更多