在数据集中插入一个与倾向得分匹配的人的值相对应的值

Insert a value corresponding to the value of a propensity score matched person in data set

我有两组(EG 和 CG),它们是倾向得分匹配的。我的第一个数据框 df_1 显示了相应的参与者对。

df_1 <- read.table(text="
         ID_EG     ID_CG
         800289    823516
         800674    820870
         811434    800796
         838623    800958
         801208    836587
         801299    855510", header=TRUE) 

此外,我有一个数据框(长格式;即,每一行都是一个测量点),其中仅包含来自 EG 的参与者。此数据框还包括一个变量,指示时间点 1 的年龄和一个变量,指示我选择参与者的年龄组。

df_2 <- read.table(text="
        ID            age_T1      age_group
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young        
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800674        40          middle
        800674        40          middle
        800674        40          middle
        800674        40          middle
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        838623        36          middle
        838623        36          middle
        838623        36          middle
        838623        36          middle
        838623        36          middle
        801208        21          young
        801208        21          young
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old", header=TRUE)

最后,我的数据框仅包含来自 CG 的参与者(同样是长格式)。此数据框不包含年龄组变量。

df_3 <- read.table(text="
        ID            age_T1
        823516        16      
        823516        16      
        823516        16      
        823516        16      
        823516        16      
        823516        16
        823516        16      
        823516        16      
        823516        16      
        823516        16
        855510        77
        855510        77
        855510        77
        855510        77
        855510        77
        855510        77
        855510        77
        820870        39        
        820870        39        
        820870        39        
        820870        39        
        800796        88  
        800796        88  
        800796        88  
        800796        88  
        800796        88  
        800796        88  
        800958        37        
        800958        37        
        800958        37        
        800958        37        
        800958        37        
        836587        18      
        836587        18", header=TRUE)

我现在想要一个包含来自 EG 和 CG 的参与者的数据框(比如 rbind df_2 和 df_3)。但我想将 age_group 上的值插入到 CG 参与者,该值对应于来自 EG 的相应匹配人员所具有的值。例如,ID 为 836587 (CG) 的人应该在 age_group 上收到与 801208 (EG) 相同的值,因为这两个参与者是匹配的对(根据 df_1)。

最终数据集应该是这样的:

df_final <- read.table(text="
        ID            age_T1      age_group
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young        
        800289        18          young
        800289        18          young
        800289        18          young
        800289        18          young
        800674        40          middle
        800674        40          middle
        800674        40          middle
        800674        40          middle
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        811434        85          old
        838623        36          middle
        838623        36          middle
        838623        36          middle
        838623        36          middle
        838623        36          middle
        801208        21          young
        801208        21          young
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        801299        77          old
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        823516        16          young
        855510        77          old
        855510        77          old
        855510        77          old
        855510        77          old
        855510        77          old
        855510        77          old
        855510        77          old
        820870        39          middle
        820870        39          middle
        820870        39          middle
        820870        39          middle
        800796        88          old
        800796        88          old
        800796        88          old
        800796        88          old
        800796        88          old
        800796        88          old
        800958        37          middle
        800958        37          middle
        800958        37          middle
        800958        37          middle
        800958        37          middle
        836587        18          young
        836587        18          young", header=TRUE)

你知道怎么做吗?非常感谢任何帮助或建议!

也许我错过了一个简单的方法来做到这一点,但这是使用 dplyr

的一种方法
library(dplyr)

df_3 %>%
   mutate(age_group = NA_character_) %>%
   bind_rows(df_2 %>% mutate(age_group = as.character(age_group))) %>%
   left_join(df_1, by = c("ID" = "ID_EG")) %>%
   mutate(age_group = ifelse(is.na(age_group),age_group[match(ID, ID_CG)], age_group)) %>%
   select(-ID_CG) 

这里我们先在df_3中添加一个空列age_group,然后用df_2绑定行。然后我们用 df_1"ID_EG" 做一个 left_join 并用相应的 "EG" 替换 age_group 中 "CG" 的 NA 值值/