【问题标题】:Use of dplyr slice_min within a function to obtain row associated with a column minimum value在函数中使用 dplyr slice_min 来获取与列最小值关联的行
【发布时间】:2021-05-18 07:15:43
【问题描述】:

我正在尝试创建一个函数,该函数返回特定条件下死亡率最低的医院。该函数的输入是状态和条件。我还应该指出我是 R 新手。我非常喜欢 dplyr 包中的函数,但似乎在使用 slice_min 函数并将变量传递给它时遇到了一些问题。如果有人可以建议什么是错误的以及如何纠正它,将不胜感激。我将在下面展示我尝试过的两个似乎不起作用的选项。

函数调用示例为:

best_hospital("CA","HeartFailure")

功能是

best_hospital <- function(state, disease_type){
    library(dplyr)
    library(janitor)

    #Loads data
    data_path <- c('D:/Data Science/CourseraR/Assign3 Info/outcome-of-care-measures.csv')
    data_df <- read.csv(data_path, colClasses = "character")

    #Replaces capitals, spaces and special characters in names
    data_df <- data_df %>% 
            clean_names() %>%
            select(state,hospital_name,
               hospital_30_day_death_mortality_rates_from_heart_attack,
               hospital_30_day_death_mortality_rates_from_heart_failure,
               hospital_30_day_death_mortality_rates_from_pneumonia)

    colnames(data_df) <- c("State", "HospitalName","HeartAttack", "HeartFailure", "Pneumonia")
    
    data_df <- data_df %>%
            filter(State == {{state}} ) %>%
            select(State, HospitalName, {{disease_type}} ) 
    
    # This DOES NOT work   
    # data_df <- data_df %>% slice_min(order_by = {{disease_type}}, with_ties = TRUE)
    
    #This DOES NOT work
    data_df <- data_df %>% slice_min(order_by = HeartFailure, with_ties = TRUE)
    
    print(head(data_df))

}

我上面展示的两种方法都选择并返回数据。但不是与感兴趣列的最小值相关联的行(在本例中为心力衰竭)。欢迎任何帮助!谢谢

【问题讨论】:

    标签: r dplyr slice


    【解决方案1】:

    尝试以下方法:

    library(dplyr)
    library(janitor)
    
    best_hospital <- function(data_df, state, disease_type){
     
      data_df <- data_df %>%
                   filter(State == state) %>%
                   select(State, HospitalName, disease_type) 
      
      data_df <- data_df %>% 
                  slice_min(order_by = .data[[disease_type]], with_ties = TRUE)
      
      return(data_df)
    }
    
    
    #Loads data
    data_path <- c('D:/Data Science/CourseraR/Assign3 Info/outcome-of-care-measures.csv')
    data_df <- read.csv(data_path, colClasses = "character")
    
    #Replaces capitals, spaces and special characters in names
    data_df <- data_df %>% 
      clean_names() %>%
      select(state,hospital_name,
             hospital_30_day_death_mortality_rates_from_heart_attack,
             hospital_30_day_death_mortality_rates_from_heart_failure,
             hospital_30_day_death_mortality_rates_from_pneumonia)
    
    colnames(data_df) <- c("State", "HospitalName","HeartAttack", "HeartFailure", "Pneumonia")
    
    result <- best_hospital(data_df, "CA","HeartFailure")
    result
    

    【讨论】:

    • 感谢您的帮助。一旦我向数字添加了强制,它似乎也有效。我找不到任何关于 .data[[disease_type]] 正在做什么以及为什么在 slice_min 中需要它但在选择或过滤器中不需要它的文档。你能提供任何建议吗?再次感谢
    • filter 中,我们传递的是我们想要过滤的值,而不是列名。在filter(State == state) 中,State 是列名,但我们传递的是state,这是该列中的一个值。 select 既适用于字符串值,也适用于不带引号的变量。所以select(State, HospitalName, .data[[disease_type]]) 也可以。当我们将列名作为字符串变量传递时,我们需要使用.data
    • 完成。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2021-08-25
    • 2021-08-27
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多