Переменная отставания по группе / показателю времени в dplyr - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть данные, которые выглядят так:

set.seed(13)
dt <- data.frame(group = c(rep("a", 3), rep("b", 4), rep("c", 3)), var = c(rep(0.1,3), rep(0.3, 4), rep(1.1,3)))
dt

   group var
1      a 0.1
2      a 0.1
3      a 0.1
4      b 0.3
5      b 0.3
6      b 0.3
7      b 0.3
8      c 1.1
9      c 1.1
10     c 1.1

Я бы хотел отложить переменную var для всех респондентов в переменной группы group.Одна трудность состоит в том, что группы имеют разный размер, иначе это не составит проблемы, указав n в качестве размера всех групп.Мои данные должны выглядеть соответственно (см. Ниже).Как мне это сделать, используя, например, dplyr

   group var lag1.var lag2.var
1      a 0.1 NA       NA
2      a 0.1 NA       NA
3      a 0.1 NA       NA
4      b 0.3 0.1      NA
5      b 0.3 0.1      NA
6      b 0.3 0.1      NA
7      b 0.3 0.1      NA
8      c 1.1 0.3      0.1
9      c 1.1 0.3      0.1
10     c 1.1 0.3      0.1

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вот еще один вариант.Сначала мы вкладываем в группу по группам, затем отображаем запаздывающие значения, а затем удаляем.

library(tidyverse)

dt %>% 
  nest(-group) %>% 
  mutate(lag1.var = map_dbl(data, ~.x$var[[1]]) %>% lag(.), lag2.var = lag(lag1.var)) %>%
  unnest
#>    group lag1.var lag2.var var
#> 1      a       NA       NA 0.1
#> 2      a       NA       NA 0.1
#> 3      a       NA       NA 0.1
#> 4      b      0.1       NA 0.3
#> 5      b      0.1       NA 0.3
#> 6      b      0.1       NA 0.3
#> 7      b      0.1       NA 0.3
#> 8      c      0.3      0.1 1.1
#> 9      c      0.3      0.1 1.1
#> 10     c      0.3      0.1 1.1
0 голосов
/ 28 сентября 2018

Вы можете создать таблицу с переменными запаздывания для каждой группы, а затем объединить ее с dt.Попробуйте это:

left_join(dt, dt %>%
                  group_by(group) %>%
                  mutate(var = first(var)) %>%
                  distinct() %>%
                  ungroup() %>%
                  mutate(lag1.var = lag(var, order_by = group),
                         lag2.var = lag(lag1.var, order_by = group)) %>%
                  select(-var),
          by = "group")
# output
   group var lag1.var lag2.var
1      a 0.1       NA       NA
2      a 0.1       NA       NA
3      a 0.1       NA       NA
4      b 0.3      0.1       NA
5      b 0.3      0.1       NA
6      b 0.3      0.1       NA
7      b 0.3      0.1       NA
8      c 1.1      0.3      0.1
9      c 1.1      0.3      0.1
10     c 1.1      0.3      0.1

Предполагается, что var всегда одинаково в каждой группе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...