我的数据集 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'”。
我该怎么做?
一种在
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))