Работа со связями с использованием ранга (R)


Я пытаюсь создать фиктивную переменную для того, родился ли ребенок первым, и одну для того, родился ли ребенок вторым. Мои данные выглядят примерно так

ID   MID   CMOB   CYRB      
1    1     1      1991
2    1     7      1989
3    2     1      1985
4    2     11     1985
5    2     9      1994
6    3     4      1992
7    4     2      1992
8    4     10     1983

С ID = идентификатор ребенка, MID = идентификатор матери, CMOB = месяц рождения и CYRB = год рождения.

Для первого манекена я попробовал использовать это:

Identifiers_age <- Identifiers_age %>% group_by(MPUBID) 
                          %>% mutate(first = as.numeric(rank(CYRB) == 1))

Но, по-видимому, нет способа разорвать связи по рангу другого столбца (очевидно, в этом случае желаемым столбцом является CMOB), всякий раз, когда я пытаюсь использовать "узы.метод " аргумент это говорит мне, что входные данные должны быть символьным вектором.

Я что-то упустил?

2 4

2 ответа:

order может быть, удобнее использовать здесь, из ?order:

Order возвращает перестановку, которая переставляет свой первый аргумент в восходящий или нисходящий порядок, разрыв связей дальнейшими аргументами.

Identifiers_age <- Identifiers_age %>% group_by(MID) %>% 
                   mutate(first = as.numeric(order(CYRB, CMOB) == 1))
Identifiers_age

#Source: local data frame [8 x 5]
#Groups: MID [4]

#     ID   MID  CMOB  CYRB first
#  <int> <int> <int> <int> <dbl>
#1     1     1     1  1991     0
#2     2     1     7  1989     1
#3     3     2     1  1985     1
#4     4     2    11  1985     0
#5     5     2     9  1994     0
#6     6     3     4  1992     1
#7     7     4     2  1992     0
#8     8     4    10  1983     1

Если мы все еще хотим использовать rank, мы можем преобразовать 'CYRB', 'CMOB' в 'Date', применить rank к нему и получить двоичный вывод на основе логического вектора

Identifiers_age %>%
         group_by(MID) %>% 
         mutate(first = as.integer(rank(as.Date(paste(CYRB, CMOB, 1,
                  sep="-"), "%Y-%m-%d"))==1))
#     ID   MID  CMOB  CYRB first
#  <int> <int> <int> <int> <int>
#1     1     1     1  1991     0
#2     2     1     7  1989     1
#3     3     2     1  1985     1
#4     4     2    11  1985     0
#5     5     2     9  1994     0
#6     6     3     4  1992     1
#7     7     4     2  1992     0
#8     8     4    10  1983     1

Или мы можем использовать арифметику, чтобы сделать это с rank

Identifiers_age %>% 
         group_by(MID) %>%
         mutate(first = as.integer(rank(CYRB + CMOB/12)==1))
#     ID   MID  CMOB  CYRB first
#   <int> <int> <int> <int> <int>
#1     1     1     1  1991     0
#2     2     1     7  1989     1
#3     3     2     1  1985     1
#4     4     2    11  1985     0
#5     5     2     9  1994     0
#6     6     3     4  1992     1
#7     7     4     2  1992     0
#8     8     4    10  1983     1