Работа со связями, используя ранг (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 = ID ребенка, MID = ID матери, CMOB = месяц рождения и CYRB = год рождения.
Для первенца я попытался использовать это:
Identifiers_age <- Identifiers_age %>% group_by(MPUBID)
%>% mutate(first = as.numeric(rank(CYRB) == 1))
Но, похоже, не существует способа разрыва связей по рангу другого столбца (очевидно, в данном случае желаемым столбцом является CMOB), всякий раз, когда я пытаюсь использовать аргумент "ties.method", он говорит мне, что входные данные должны быть символьный вектор.
Я что-то здесь упускаю?
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" в "Дата", применить 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