#r #dplyr
#r #dplyr
Вопрос:
У меня в моих данных есть этот столбец :
table(data$year)
2011 2012 2013 2014 2015 2016 2017 2018 2019
2 28 17 36 26 29 37 33 10
is.numeric(data$year)
[1] TRUE
Я хочу мутировать с помощью case_when с помощью следующего кода :
data <- data %>%
mutate(periode_2a = case_when(
year >= 2011 amp;amp; year <= 2013 ~ "2011-2013",
year >= 2014 amp;amp; year <= 2015 ~ "2014-2015",
year >= 2016 amp;amp; year <= 2017 ~ "2013-2017",
TRUE ~ "2018-2019"
))
Что, я думаю, очевидно: я хочу создать категорию лет.
Я получаю, что :
table(data$periode_2a)
2011-2013
218
Я попробовал какой-то другой стиль :
> data <- data %>%
mutate(periode_2a = case_when(
year == 2011:2013 ~ "2011-2013",
year == 2014:2015 ~ "2014-2015",
year == 2016:2017 ~ "2013-2017",
TRUE ~ "2018-2019"
))
или
> data <- data %>%
mutate(periode_2a = case_when(
year == "2011"|"2012"|"2013" ~ "2011-2013",
year == "2014"|"2015" ~ "2014-2015",
year == "2016"|"2017" ~ "2013-2017",
TRUE ~ "2018-2019"
))
безуспешно…
Что я сделал не так??
Спасибо всем
Комментарии:
1. В первом блоке кода удалите
amp;amp;
и замените наamp;
, а во втором используйте%in%
вместо==
2. Спасибо, работает отлично!
Ответ №1:
Мы можем использовать %in%
для вектора длиной больше 1
library(dplyr)
data %>%
mutate(periode_2a = case_when(
year %in% 2011:2013 ~ "2011-2013",
year %in% 2014:2015 ~ "2014-2015",
year %in% 2016:2017 ~ "2013-2017",
TRUE ~ "2018-2019"
))
==
Будет полезно для поэлементных операций, т.Е. Если длина обоих объектов одинакова для оператора (или если rhs имеет длину 1 — он перерабатывается). Когда имеется более одного элемента, повторное использование с поэлементным сравнением будет сброшено, как только оно достигнет длины вектора. Что касается использования amp;amp;
, он возвращает один TRUE/FALSE
вывод
Ответ №2:
Вместо использования нескольких условий в case_when
вы можете использовать cut
с labels
.
Поскольку вы не предоставили пример, я буду использовать mpg
столбец набора данных по умолчанию mtcars
.
mtcars$mpg
#[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3
#[14] 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3
#[27] 26.0 30.4 15.8 19.7 15.0 21.4
Вы можете определить интервалы, на которые вы хотите разделить данные, breaks
и построить labels
из них.
breaks <- c(0, 15, 20, 25, 50)
labels <- paste(head(breaks, -1), tail(breaks, -1), sep = "-")
cut(mtcars$mpg, breaks, labels)
#[1] 20-25 20-25 20-25 20-25 15-20 15-20 0-15 20-25 20-25 15-20 15-20
#[12] 15-20 15-20 15-20 0-15 0-15 0-15 25-50 25-50 25-50 20-25 15-20
#[23] 15-20 0-15 15-20 25-50 25-50 25-50 15-20 15-20 0-15 20-25
#Levels: 0-15 15-20 20-25 25-50
Это будет полезно, когда у вас в ваших данных большое количество лет и условия записи для каждого из них могут быть утомительными.