Создайте условную временную шкалу на основе событий в R - PullRequest
0 голосов
/ 02 мая 2018

У меня есть данные, где переменная «Закон» указывает на изменения в законодательстве в разных местах («Место»):

Person  Place  Year  Law
1         A    1990   0
2         A    1991   1
3         A    1992   1
4         B    1990   0
5         B    1991   0
6         B    1992   1
7         B    1993   1
8         B    1993   1
9         B    1993   1
10        B    1992   1

В основном закон был введен в действие в 1991 году и оставался в силе в течение всех последующих периодов времени. Он был внедрен на месте B в 1992 году и оставался в силе и т. Д.

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

Мне нужен окончательный фрейм данных, чтобы он выглядел так:

Person  Place  Year  Law  timeline 
1         A    1990   0     -1
2         A    1991   1      0
3         A    1992   1      1
4         B    1990   0     -2
5         B    1991   0     -1
6         B    1992   1      0
7         B    1993   1      1
8         B    1993   1      2
9         B    1993   1      2
10        B    1992   1      1

Я пытался:

library(dplyr)
df %>% 
 group_by(Place) %>%
 arrange(Year) %>%
 mutate(timeline = rank(Law))

но он не работает так, как мне нужно. Что я делаю неправильно? Могу ли я сделать это в dplyr или мне нужно создать комплекс для цикла?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

с использованием data.table

library(data.table)
setDT(dat)[,timeline:=sequence(.N)-which.min(!Law),by=Place]
dat
   Person Place Year Law timeline
1:      1     A 1990   0       -1
2:      2     A 1991   1        0
3:      3     A 1992   1        1
4:      4     B 1990   0       -2
5:      5     B 1991   0       -1
6:      6     B 1992   1        0
7:      7     B 1993   1        1

Использование базы r:

transform(dat,timeline=ave(Law,Place,FUN=function(x)1:length(x)-which.min(!x)))
  Person Place Year Law timeline
1      1     A 1990   0       -1
2      2     A 1991   1        0
3      3     A 1992   1        1
4      4     B 1990   0       -2
5      5     B 1991   0       -1
6      6     B 1992   1        0
7      7     B 1993   1        1
0 голосов
/ 02 мая 2018

Вы можете вычесть row_numer по индексу, в котором реализовано Law:

df %>% 
    arrange(Year) %>% 
    group_by(Place) %>% 
    mutate(timeline = row_number() - which(diff(Law) == 1) - 1) %>% 
    arrange(Place)

# A tibble: 7 x 5
# Groups:   Place [2]
#  Person Place  Year   Law timeline
#   <int> <fct> <int> <int>    <dbl>
#1      1 A      1990     0      -1.
#2      2 A      1991     1       0.
#3      3 A      1992     1       1.
#4      4 B      1990     0      -2.
#5      5 B      1991     0      -1.
#6      6 B      1992     1       0.
#7      7 B      1993     1       1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...