Работа со связями с использованием ранга (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 ответа:
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