переупорядочение личных идентификаторов между столбцами - PullRequest
1 голос
/ 27 апреля 2020

Рассмотрим следующий (наименьший подвыбор) набора данных однополых пар.

df<-data.frame(c("A1", "A2"), c("q2", "q3"), c("q1","q4"), c(19520410, 19510101), c(19500702, 19651215))
colnames(df)<-c("householdnr", "id_1", "id_2", "birthday_1", "birthday_2")

В приведенном выше наборе данных, домохозяйство указывает, какие лица принадлежат друг другу, тогда как в столбцах id_1 и id_2 указывается, какой человек входит в конкретную пару.

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

householdnr  id_1 id_2  birthday_1 birthday_2
A1            q1   q2   1950-07-02  1952-04-10
A2            q3   q4   1951-01-01  1965-12-15

Кто-нибудь знает, как мне это сделать? Я ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Это грязное базовое решение R, полезное, если ваш набор данных не очень большой, поскольку включает цикл for.

Сначала я преобразовываю факторы в символы и создаю правильные переменные даты используя пакет lubridate

df$id_1 <- as.character(df$id_1)
df$id_2 <- as.character(df$id_2)
df$birthday_1 <- lubridate::ymd(df$birthday_1)
df$birthday_2 <- lubridate::ymd(df$birthday_2)

Затем используйте цикл for

for(i in 1:nrow(df))
  if(df$birthday_1[i] > df$birthday_2[i]){

    # invert IDs
    temp <- df$id_1[i]
    df$id_1[i] <- df$id_2[i]
    df$id_2[i] <- temp

    # invert dates
    temp <- df$birthday_1[i]
    df$birthday_1[i] <- df$birthday_2[i]
    df$birthday_2[i] <- temp
  }

Выход

  householdnr id_1 id_2 birthday_1 birthday_2
1          A1   q1   q2 1950-07-02 1952-04-10
2          A2   q3   q4 1951-01-01 1965-12-15
1 голос
/ 27 апреля 2020

Сначала мы можем получить данные в длинном формате, разделив дни рождения и значение id в разных столбцах, arrange данные на birthday и вернуть данные в широком формате.

library(dplyr)
library(tidyr)

df %>%
  mutate_all(as.character) %>%
  pivot_longer(cols = -householdnr, 
               names_to = c('.value', 'value'), 
               names_sep = "_") %>%
  mutate(birthday = lubridate::ymd(birthday)) %>%
  arrange(householdnr, birthday) %>%
  group_by(householdnr) %>%
  mutate(value = row_number()) %>%
  pivot_wider(names_from = value, values_from = c(id, birthday))

#  householdnr id_1  id_2  birthday_1 birthday_2
#  <chr>       <chr> <chr> <date>     <date>    
#1 A1          q1    q2    1950-07-02 1952-04-10
#2 A2          q3    q4    1951-01-01 1965-12-15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...