2016-08-06 3 views
4

Я пытаюсь создать фиктивную переменную для того, родится ли ребенок, а другой - если ребенок родился вторым. Мои данные выглядит как этотРабота с связями с использованием ранга (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)) 

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

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

ответ

4

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 
+0

Ах, это прекрасно, спасибо! – Milhouse

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 
Смежные вопросы