为什么arrange()忽略值? (不与分组一起使用)

时间:2017-12-04 23:12:44

标签: r ranking

我的问题是关于使用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的标记从该柱的顶部切下并粘贴在柱的底部。知道可能出了什么问题吗?如果我输入“心脏病发作”代替“肺炎”,该列似乎排序得很好,我得到了正确的输出。我百分百肯定唯一的区别是“肺炎”而非“心脏病发作”。

1 个答案:

答案 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"