请考虑以下同性伴侣数据集(较小的子样本)。
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
有人知道我该怎么做吗?感谢您的帮助。
我们首先可以通过在不同的列中分隔生日和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
这是一个肮脏的基本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