R中如何将一列的信息相互链接

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

我有一个包含大约 150 万个人的数据集,可以通过“家庭 ID”在他们的家庭中进行区分。该数据集有一列(关系),根据家庭成员与户主的关系指定家庭成员之间的关系。

    library(tidyverse)
    sample <- tibble( 
    household.ID = c(11015015988, 11015015988, 11015015988 , 11015015988 , 11015015988, 
    11015015988, 11015015988, 11015015988 ),
    member.ID= c(1101502683 ,11015026954,11015027098,11015027231 ,11015027353,11015027484 
    ,11015027615 ,11015027751),
    relationship = c(1,2,3,3,3,3,2,3),
    gender = c(1,2,1,2,1,1,2,2),
    age = c(54,54,30,26,23,31,20,2),
    marriage.status= c(1,1,4,4,4,1,1,NA),
    children.ever.born= c(NA,8,NA,NA,NA,NA,1,NA),
    living.children  = c(NA,8,NA,NA,NA,NA,1,NA))

“代码1”指的是户主; “代号2”是团长的妻子; “code 3”是head的孩子;因此,家庭中任何具有“代码2”的人都是“代码3”的母亲。我需要以这样的方式链接“代码 2”和“代码 3”:在每个家庭 ID 中,对于关系值为 3 的关系值,标识来自关系值为 2 的同一家庭的成员 ID。使用代码(由 @JonSpring 编写)我有能力做到。

    sample2 <- select(sample, 1:8) 
    spouse_links <- left_join(relationship = "many-to-many",
    sample2 %>% filter(relationship == 3),
    sample2 %>% filter(relationship == 2, !is.na(living.children)) %>%
    rename(member.ID.mother = member.ID), join_by(household.ID)) %>%
    filter(!is.na(relationship.y)) %>%
    select(1:8, member.ID.mother)

但是,我对一夫多妻制(与多个配偶结婚的做法)为习俗的家庭有疑问。在这样的家庭中,我们在关系栏中会遇到两个或多个“代码2”;结果,R 代码将所有“代码 3”链接到“代码 2”。为了澄清这一点,请考虑下表:

根据该表,我们可以发现孩子与母亲的联系是基于家庭中的亲疏程度。例如,第 2 行是第 3、4、5 和 6 行中子项的母亲,第 7 行是第 8 行的母亲。我需要访问如下表:

但是,上述准则对于一夫多妻制习俗的家庭并不适用。我非常感谢您能提供的任何帮助。

r select dplyr filter left-join
1个回答
0
投票

可能有一种更优雅的方法来解决此问题,但您可以使用

cumsum(sample$relationship == 2)
创建按家庭内部划分价值观的指标。

dplyr
管道中,这可以应用于将每个组拆分为一个列表(通过
group_split
),然后使用
map
创建
mother.member.ID
变量:

sample %>%
  mutate(row = row_number(),
         .by = household.ID) %>%
  filter(relationship != 1) %>%
  group_split(grp = cumsum(relationship == 2)) %>%
  map(~mutate(., mother.member.ID =  member.ID[relationship == 2]) %>% 
        filter(relationship == 3)) %>%
  bind_rows() %>% select(-grp)

#  household.ID   member.ID relationship gender   age marriage.status children.ever.born living.children   row mother.member.ID
#         <dbl>       <dbl>        <dbl>  <dbl> <dbl>           <dbl>              <dbl>           <dbl> <int>            <dbl>
#1  11015015988 11015027098            3      1    30               4                 NA              NA     3      11015026954
#2  11015015988 11015027231            3      2    26               4                 NA              NA     4      11015026954
#3  11015015988 11015027353            3      1    23               4                 NA              NA     5      11015026954
#4  11015015988 11015027484            3      1    31               1                 NA              NA     6      11015026954
#5  11015015988 11015027751            3      2     2              NA                 NA              NA     8      11015027615
© www.soinside.com 2019 - 2024. All rights reserved.