在多对一框架中合并两个数据集,其中数据集 B 的列是数据集 A 的子集

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

我的数据集 A 是一组个体,如下所示。许多人可以属于一个家庭(变量fam_id)。我在这个数据集中有个人变量和家庭变量。正如您所看到的,我有 2012 年的家庭变量值,但没有 2013 年和 2014 年的家庭变量值。

person_id fam_id personvar1 personvar2 familyvar1 家庭变量2
1 50 2012 500 字符串A 1000 字符串W
2 50 2012 550 字符串B 1000 字符串W
3 60 2012 710 字符串C 150 字符串X
4 70 2012 800 字符串C 200 字符串Y
5 70 2012 0 字符串J 200 字符串Y
1 50 2013 120 字符串J 不适用 不适用
2 50 2013 370 字符串K 不适用 不适用
3 60 2013 80 字符串L 不适用 不适用
1 50 2014 100 字符串M 不适用 不适用
2 50 2014 500 字符串M 不适用 不适用
3 60 2014 300 弦O 不适用 不适用

数据集B是2013年家庭的面板。它只有家庭变量,与数据集A中的相同。

fam_id familyvar1 家庭var2
50 2013 400 字符串W
60 2013 700 字符串Y
70 2013 1000 字符串Z

我想用数据集 B 的相应值“填充”数据集 A 中 2013 年的 NA 系列变量。

我已经尝试过了

merged_DT <- merge(A, B, by = c("fam_id", "year", "familyvar", "familyvar2") , all.x = TRUE)

但这会以某种方式生成 NA,而不是适当地合并。

我还尝试了通过ID在R中合并两个数据帧,一个是另一个的子集方法,但我收到错误“未找到对象'..cols'”。

我该怎么做?

r merge subset na missing-data
1个回答
0
投票

一种在

coalesce
之后使用
left_join
familyvars 聚集在一起的方法。如果您在连接中包含 familyvars,如果它们不匹配,则不会添加它们。

library(dplyr)

left_join(A, B, c("fam_id", "year")) %>% 
  mutate(familyvar1 = coalesce(familyvar1.x, familyvar1.y), 
         familyvar2 = coalesce(familyvar2.x, familyvar2.y)) %>% 
  select(-ends_with(c(".x", ".y")))
   person_id fam_id year personvar1 personvar2 familyvar1 familyvar2
1          1     50 2012        500    stringA       1000    stringW
2          2     50 2012        550    stringB       1000    stringW
3          3     60 2012        710    stringC        150    stringX
4          4     70 2012        800    stringC        200    stringY
5          5     70 2012          0    stringJ        200    stringY
6          1     50 2013        120    stringJ        400    stringW
7          2     50 2013        370    stringK        400    stringW
8          3     60 2013         80    stringL        700    stringY
9          1     50 2014        100    stringM         NA       <NA>
10         2     50 2014        500    stringM         NA       <NA>
11         3     60 2014        300    stringO         NA       <NA>

数据

A <- structure(list(person_id = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L,
1L, 2L, 3L), fam_id = c(50L, 50L, 60L, 70L, 70L, 50L, 50L, 60L,
50L, 50L, 60L), year = c(2012L, 2012L, 2012L, 2012L, 2012L, 2013L,
2013L, 2013L, 2014L, 2014L, 2014L), personvar1 = c(500L, 550L,
710L, 800L, 0L, 120L, 370L, 80L, 100L, 500L, 300L), personvar2 = c("stringA",
"stringB", "stringC", "stringC", "stringJ", "stringJ", "stringK",
"stringL", "stringM", "stringM", "stringO"), familyvar1 = c(1000L,
1000L, 150L, 200L, 200L, NA, NA, NA, NA, NA, NA), familyvar2 = c("stringW",
"stringW", "stringX", "stringY", "stringY", NA, NA, NA, NA, NA,
NA)), class = "data.frame", row.names = c(NA, -11L))

B <- structure(list(fam_id = c(50L, 60L, 70L), year = c(2013L, 2013L,
2013L), familyvar1 = c(400L, 700L, 1000L), familyvar2 = c("stringW",
"stringY", "stringZ")), class = "data.frame", row.names = c(NA,
-3L))
© www.soinside.com 2019 - 2024. All rights reserved.