如何获取对应最低死亡率的医院名称?求R代码优化方案
解决方案:获取对应最低死亡率的医院名称
你的现有代码核心问题是:tapply只提取了死亡率数据分组排序,完全丢失了和医院名称的关联,所以没法直接对应回医院信息。下面是修正后的实现思路和代码:
基础R实现步骤
- 先筛选阿拉巴马州(AL)的肺炎有效数据,排除死亡率为
NA的行:
# 筛选目标州+疾病的有效数据 al_pneumonia_data <- data[data$State == "AL" & !is.na(data$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia), ]
- 提取该州肺炎的最低死亡率:
lowest_rate <- min(al_pneumonia_data$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia)
- 匹配对应的医院名称(如果有多个医院并列最低,会返回所有;若要取名称排序后的第一个,再加一步排序):
# 获取所有并列最佳的医院 best_hospitals <- al_pneumonia_data$Hospital.Name[al_pneumonia_data$Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia == lowest_rate] # 按名称排序后取第一个(处理并列场景) top_best_hospital <- sort(best_hospitals)[1]
函数化优化方案(适配参数传入)
如果要写成接收州和疾病参数的通用函数,推荐用dplyr简化逻辑(代码更清晰易维护):
library(dplyr) get_best_hospital <- function(target_state, target_disease) { # 建立疾病与对应列名的映射,避免硬编码 disease_col_map <- list( pneumonia = "Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia", heart_failure = "Hospital.30.Day.Death..Mortality..Rates.from.Heart.Failure", heart_attack = "Hospital.30.Day.Death..Mortality..Rates.from.Heart.Attack" ) target_column <- disease_col_map[[target_disease]] data %>% # 筛选目标州+非缺失的死亡率数据 filter(State == target_state, !is.na(.data[[target_column]])) %>% # 按死亡率升序、医院名称升序排序 arrange(.data[[target_column]], Hospital.Name) %>% # 取第一行 slice(1) %>% # 提取医院名称 pull(Hospital.Name) } # 调用示例:获取阿拉巴马州肺炎最佳医院 get_best_hospital("AL", "pneumonia")
现有代码的优化点
- 放弃
tapply处理多列关联数据:tapply仅适合单变量的分组聚合,无法保留原始行的多字段关联,这里必须基于完整行筛选。 - 强制处理缺失值:死亡率列大概率存在
NA,直接计算min会得到无效结果,必须先过滤。 - 处理并列场景:多个医院可能有相同最低死亡率,按名称排序取第一个是行业通用的处理规则。
- 函数化用列名映射:避免硬编码疾病列名,让函数适配三种疾病的查询,扩展性更强。
内容的提问来源于stack exchange,提问作者szechuan_famous
相关产品推荐
相关产品推荐

