R中的逻辑运算符的问题,使用ifelse

问题描述 投票:0回答:1

下面是我正在使用的代码。我们的想法是,我们有一个变量“ habitaciones”,它可以计算酒店房间的数量。我创建了一个名为hrango的新变量,该变量的范围取决于房间的数量。人数少于或等于20的酒店规模较小,人数在21至40之间的酒店规模中等,大于40的酒店规模较大。您可以看到我如何尝试使用运算符来处理它。

当我运行此代码时,问题在于将少于10个房间的任何酒店标记为大酒店,而将超过100个房间的任何酒店标记为小酒店,我似乎无法弄清原因。我开始使用基于“替换”的代码,该代码无法正常工作,移至ifelse,仍然无法获得所需的结果。

任何帮助将不胜感激。

full_data <- full_data %>% 
  mutate (hrango = ifelse(habitaciones < 21, "Hoteles Pequenos",
                          ifelse(habitaciones > 20 & habitaciones < 41, "Hoteles Medios",
                                 ifelse(habitaciones > 40, "Hoteles Grandes", hrango)
                                        )
                                        )
                                       )
r if-statement replace
1个回答
2
投票
  1. 通常,基数R的ifelse有一定的负担,即它将降级。例如,

    ifelse(c(T,F), rep(Sys.time(),2), rep(Sys.time(),2))
    # [1] 1591376254 1591376254
    

    由于您已经在使用dplyr,建议您考虑dplyr::if_else

    if_else(c(T,F), rep(Sys.time(),2), rep(Sys.time(),2))
    # [1] "2020-06-05 09:57:57 PDT" "2020-06-05 09:57:57 PDT"
    

    ([data.table::fifelse也不错。)

  2. 当我看到嵌套的ifelse时,我认为case_when会更好。它通常不faster(它几乎是相同的),但是它更具可读性,因此易于维护。

    full_data %>%
      mutate(
        hrango = case_when(
          habitaciones < 21                     ~ "Hoteles Pequenos",
          habitaciones > 20 & habitaciones < 41 ~ "Hoteles Medios",
          habitaciones > 40                     ~ "Hoteles Grandes",
          TRUE ~ hrango)
      )
    

    由于case_when在第一个为真之后停止评估(对于每个元素),因此您可以将其缩短一点:

    full_data %>%
      mutate(
        hrango = case_when(
          habitaciones < 21 ~ "Hoteles Pequenos",
          habitaciones < 41 ~ "Hoteles Medios",
          habitaciones > 40 ~ "Hoteles Grandes",
          TRUE ~ hrango)
      )
    
  3. 此外,由于您只是在连续的值范围内查找,因此可以使用cut

    full_data %>%
      mutate(
        hrango = cut(hrango, c(-Inf, 20, 40, Inf),
                     labels = c("Hoteles Pequenos", "Hoteles Medios", "Hoteles Grandes")),
        hrango = as.character(hrango)
      )
    

    as.character的第二个赋值是因为cut返回factor,而我推断您想要character

    另外一个注意事项:由于您的条件重叠,我推断您正在使用integercase_when解决方案仍然可以使用,但是如果您的数据为numeric,则可能需要重新考虑边界以确保获得所需的东西。由于cut默认为“右闭”(right=TRUE),它将为您左开,因此(0,20](20,40]表示第20个匹配第一个,20.1和21个匹配第二个,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.