将两个id变量匹配到一个家庭变量

时间:2019-11-28 18:22:51

标签: r

我有一个关于使用另一个id变量合并两个id变量的问题。听起来可能有些含糊,请查看下面的

数据集(的样本)
Householdid personid    gender      begin_hh    end_hh      typhh
A1             q1       male        19490410    20000101    2
A2             q1       male        20000102    20101010    3
C1             q2       0           19891010    20000101    NA
A2             q2       0           20000102    20101010    3

该数据集背后的故事可能如下。在1994年至2000年之间,q1人独居,q2人的家庭状况未知。住户变量和不等于3的家庭变量表明这两个人没有在一起生活。在2000年至2010年期间,两个人结为夫妻,我们可以从以下事实得出结论: )等于3,并且两个人的户口号码相同(即,两者都用A2表示)。如果家庭成员不同,则意味着他们与另一个人结为夫妻。我想将此数据集转换为以下内容:

Householdid   personid.male pensionid. female   begin_hh    end_hh      typhh
A1                  q1             NA           19490410    20000101     2
A2                  q1             q2           20000102    20101010     3
C1                  NA             q2           19891010    20000101    NA

我尝试使用reshape命令,但是在我的代码中,它也将在两个人不在一起的时期(即,typhh等于2或NA)匹配该personid。有谁知道我怎么能得到这个?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以根据需要使用pivot_wider中的tidyr

library(tidyr)

pivot_wider(df, 
            id_cols = c(Householdid, begin_hh, end_hh, typhh), 
            names_from = gender, 
            values_from = personid, 
            names_prefix = "person_")

其中df是要旋转的数据框。

答案 1 :(得分:0)

我们可以使用data.table dcast

library(data.table)
dcast(setDT(df1)[gender == 0, gender := "female"], 
    Householdid + begin_hh + end_hh + typhh ~ 
         paste0("person_", gender), value.var = "personid")
#   Householdid begin_hh   end_hh typhh person_female person_male
#1:          A1 19490410 20000101     2          <NA>          q1
#2:          A2 20000102 20101010     3            q2          q1
#3:          C1 19891010 20000101    NA            q2        <NA>

数据

df1 <- structure(list(Householdid = c("A1", "A2", "C1", "A2"), personid = c("q1", 
"q1", "q2", "q2"), gender = c("male", "male", "0", "0"), begin_hh = c(19490410L, 
20000102L, 19891010L, 20000102L), end_hh = c(20000101L, 20101010L, 
20000101L, 20101010L), typhh = c(2L, 3L, NA, 3L)), 
class = "data.frame", row.names = c(NA, 
-4L))