下面是我正在使用的代码。我们的想法是,我们有一个变量“ 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的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
也不错。)
当我看到嵌套的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)
)
此外,由于您只是在连续的值范围内查找,因此可以使用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
。
另外一个注意事项:由于您的条件重叠,我推断您正在使用integer
。 case_when
解决方案仍然可以使用,但是如果您的数据为numeric
,则可能需要重新考虑边界以确保获得所需的东西。由于cut
默认为“右闭”(right=TRUE
),它将为您左开,因此(0,20]
和(20,40]
表示第20个匹配第一个,20.1和21个匹配第二个,依此类推。