我的问题是关于使用dplyr包中的编配功能,我看到了一些帖子,但是所有帖子都涉及到分组和安排的问题,而且只是安排似乎导致了我的问题。它只是正确地对我的数据的某些列进行排序。
我不知道你是否能用数据重现我的问题,所以here是它的链接。这是一个称为护理措施结果的文件.sv,医院的数据框架和其他健康相关的变量。我写了一个最好的函数,它应该在给定的3种健康状况下,在给定的输入状态下以30天的最低死亡率评分返回医院。
我读取数据并为我想要阅读相关列的时间指定名称;
best<-function(ST, outcome){
library(dyplr)
data<-read.csv("outcome-of-care-measures.csv", na.strings = "Not available", stringsAsFactors = FALSE)
outcomes<-c("heart attack"=11, "heart failure"=17, "pneumonia"=23)
然后我有3个分支,每个分支都找到输入健康状况的死亡率最低的医院。我的第一个分支功能很好,我不能分辨出那个不起作用的分支。下面的分支返回输出列未正确排序的数据。
if (outcome=="pneumonia"){
rel_data<-data[, c(2,7,outcomes["pneumonia"])]
names(rel_data)<-c("hospital", "state", "outcome")
sorted<- arrange(rel_data, state, outcome, hospital)
state_sorted<-subset(sorted, state==ST)
print(state_sorted$hospital[1])}}
当我打电话给最好的(“MD”,“肺炎”)时,它会返回排名第10的医院,而不是第一家。看起来1-9的标记从该柱的顶部切下并粘贴在柱的底部。知道可能出了什么问题吗?如果我输入“心脏病发作”代替“肺炎”,该列似乎排序得很好,我得到了正确的输出。我百分百肯定唯一的区别是“肺炎”而非“心脏病发作”。
答案 0 :(得分:1)
这是一个使用tidyverse
包生态系统完成您所需的功能。
getBestHospital <- function(data, state, outcome) {
# column numbers for health conditions
outcomes <- c("heart attack" = 11, "heart failure" = 17, "pneumonia" = 23)
# get name of column to sort by
sortCol <- colnames(data)[outcomes[outcome]]
# return top-ranked hospital for given state and outcome
data %>%
dplyr::filter(State == state) %>%
dplyr::arrange_(paste0("`", sortCol, "`")) %>%
.$`Hospital Name` %>%
head(1)
}
以下是如何称呼它:
library(tidyverse)
d <- readr::read_csv("~/../Downloads/outcome-of-care-measures.csv", na = "Not Available")
getBestHospital(d, "MD", "pneumonia")
请注意,使用na = "Not Available"
解决了结果列中包含非数字数据的问题。
一些示例输出:
> getBestHospital(d, "MD", "pneumonia")
[1] "GREATER BALTIMORE MEDICAL CENTER"
> getBestHospital(d, "CA", "heart attack")
[1] "GLENDALE ADVENTIST MEDICAL CENTER"
> getBestHospital(d, "FL", "heart failure")
[1] "FLORIDA HOSPITAL HEARTLAND MEDICAL CENTER"