Условный и групповой мутированный dplyr

Допустим, у меня есть следующие данные увеличения носка на ящик

>socks
year  drawer_nbr  sock_total
1990    1           2
1991    1           2
1990    2           3
1991    2           4
1990    3           2
1991    3           1

Я хотел бы иметь бинарную переменную, которая определяет, увеличились ли носки в каждом ящике. 1, если они увеличились, и 0, если нет. Результат будет

>socks
drawer_nbr  growth
  <dbl>     <factor>
    1          0  
    2          1
    3          0

Я зацикливаюсь на сравнении sock_total одного года против sock_total другого года. Я знаю, что мне нужно использовать dplyr::summaries(), но у меня есть трудности с тем, что входит в эту функцию.

2 ответа

Решение

Если вы сравниваете 1991 год с 1990 годом, вы можете сделать:

socks %>% 
    group_by(drawer_nbr) %>% 
    summarise(growth = +(sock_total[year == 1991] - sock_total[year == 1990] > 0))
# A tibble: 3 x 2
#  drawer_nbr growth
#       <int>  <int>
#1          1      0
#2          2      1
#3          3      0

Вы могли бы использовать смесь dplyr а также tidyr:

library(tidyr)
library(dplyr)

socks %>%
  group_by(drawer_nbr) %>% 
  spread(year, sock_total) %>%
  mutate(growth = `1991` - `1990`)

Или, если вы хотите, чтобы рост был только двоичным:

socks %>%
  group_by(drawer_nbr) %>% 
  spread(year, sock_total) %>%
  mutate(growth = ifelse((`1991` - `1990`) > 0,
                         1, 0))
Другие вопросы по тегам