Добавление нового столбца в фрейм данных с использованием чисел для отображения порядка даты (от самой старой до самой последней) - PullRequest
1 голос
/ 04 апреля 2019

У меня в настоящее время есть фрейм данных, который выглядит следующим образом:

   ID        DOB
1 535 1994-03-06
2 429 2001-01-08
3 535 1999-06-12
4 535 2001-04-06
5 111 1994-08-08
6 429 1995-09-20

Каждая из строк представляет разных людей, и каждый из идентификаторов указывает семьи каждого человека.

Я хочу вот что:

   ID        DOB birthOrder
1 111 1994-08-08          1
2 429 1995-09-20          1
3 429 2001-01-08          2
4 535 1994-03-06          1
5 535 1999-06-12          2
6 535 2001-04-06          3

Мне бы хотелось, чтобы в новом столбце birthOrder отображался порядок рождения каждого человека в семье (от самого старшего до самого младшего).Какую функцию я бы использовал для этого?

Еще одним осложнением для этого кода будет присутствие близнецов.Если бы во фрейме данных были двойники, я бы хотел, чтобы фрейм результирующих данных выглядел так:

   ID        DOB birthOrder
1 111 1994-08-08          1
2 429 1995-09-20          1
3 429 2001-01-08          2
4 429 2001-01-08          2
5 535 1994-03-06          1
6 535 1999-06-12          2
7 535 2001-04-06          3`

Могу ли я использовать функцию rank из dplyr для создания этой новой переменной?

1 Ответ

0 голосов
/ 04 апреля 2019

Мы можем использовать row_number() после группировки по «ID». Поскольку строки должны быть упорядочены по 'DOB', arrange по 'DOB' после преобразования в Date class

library(tidyverse)
df1 %>% 
    group_by(ID) %>% 
    arrange(ID, as.Date(DOB)) %>% 
    mutate(birthOrder = row_number())
# A tibble: 6 x 3
# Groups:   ID [3]
#     ID DOB        birthOrder
#  <int> <chr>           <int>
#1   111 1994-08-08          1
#2   429 1995-09-20          1
#3   429 2001-01-08          2
#4   535 1994-03-06          1
#5   535 1999-06-12          2
#6   535 2001-04-06          3

Или для второго случая мы можем использовать match

df2 %>%
   arrange(ID, as.Date(DOB)) %>% 
   group_by(ID) %>% 
   mutate(birthOrder = match(DOB, unique(DOB)))
# A tibble: 7 x 3
# Groups:   ID [3]
#     ID DOB        birthOrder
#  <int> <chr>           <int>
#1   111 1994-08-08          1
#2   429 1995-09-20          1
#3   429 2001-01-08          2
#4   429 2001-01-08          2
#5   535 1994-03-06          1
#6   535 1999-06-12          2
#7   535 2001-04-06          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...