#r #dplyr
#r #dplyr
Вопрос:
Я хотел спросить, знает ли кто-нибудь, как решить мою проблему:
` master1<- master %>%
mutate(underweight=BMI<18.5,
normal=BMI%in%c(18.5,24.9),
overweight=BMI%in%c(25,29.9),
obese=BMI%in%c(30,34.9),
extreme=BMI>35) `
Я хочу создать новый тип столбцов.. для недостаточного и экстремального веса это работает, но для нормального, избыточного веса и ожирения, я думаю, я кодирую неправильный диапазон чисел…
Комментарии:
1. Пожалуйста, покажите небольшой воспроизводимый пример с
dput
ожидаемым результатом2.
%in%
для точных совпадений. Я предполагаю, что вы ищетеdplyr::between()
3. Пожалуйста, не создавайте больше работы для других людей, вандализируя ваши сообщения. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange не подлежащее отзыву право на распространение этого контента в соответствии с лицензией CC BY-SA 4.0 (т. Е. Независимо от вашего будущего выбора). Согласно политике обмена стеками, распространяется версия post, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?
Ответ №1:
%in%
Будут проверяться только точные значения. Поскольку это числа с плавающей запятой, они также могут не совпадать. Здесь нам могут понадобиться операторы сравнения ( <
, >
с amp;
) или использовать between
library(dplyr)
master1 <- master %>%
mutate(underweight = BMI < 18.5,
normal = between(BMI, 18.5, 24.9),
overweight = between(BMI, 25, 29.9),
obese = between(BMI, 30, 34.9),
extreme = BMI > 35))
Ответ №2:
Я создал воспроизводимый пример (reprex), чтобы помочь объяснить, и я использовал пакет {dplyr}:
library(dplyr)
# Create data frame for 34 subjects
# and add a column with random numbers for weight between 15 and 34
master1 <- data.frame(
subjects = sample(1:34)
) %>%
mutate(BMI = runif(34, min = 15, max = 34),
BMI = round(BMI, digits = 1)) # rounds to 1 digit
Когда вы перекодируете, лучше всего перекодировать в один столбец, это называется данными длинной формы:
# Create a column called category with the labels for the weight groups
master1 <- master1 %>%
category = case_when(BMI <= 18.5 ~ "underweight",
BMI >= 18.5 amp; BMI <= 24.9 ~ "normal",
BMI >= 25 amp; BMI <= 29.9 ~ "overweight",
BMI >= 30 amp; BMI <= 34.9 ~ "obese",
BMI >= 35 ~ "extreme",
TRUE ~ NA_character_ # Just in case anything is # outside of these numbers this will return an NA which means nothing was entered
))