Использование case_whening i r dplyr с OR

#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
  

Это будет полезно, когда у вас в ваших данных большое количество лет и условия записи для каждого из них могут быть утомительными.