在各列之间重新排列个人ID

问题描述 投票:1回答:2

请考虑以下同性伴侣数据集(较小的子样本)。

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")

在上面的数据集中,Householdr指示哪些人属于彼此,而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

有人知道我该怎么做吗?感谢您的帮助。

r
2个回答
1
投票

我们首先可以通过在不同的列中分隔生日和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

1
投票

这是一个肮脏的基本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
© www.soinside.com 2019 - 2024. All rights reserved.