【发布时间】:2021-11-01 00:12:12
【问题描述】:
我有两个要在变量id 上合并的数据集,其中一个有两个可能的 id,例如:
df1 <- data.frame(id = c('a', 'b', 'c', 'q', 'z'),
id2 = c('NA', 'g', 'NA', 'd', 'e'),
var1 = 1:5,
var3 = c('hi', 'hello', 'bonjour', 'howdy', 'hi'))
df2 <- data.frame(id = c('a', 'b', 'c', 'd', 'e'),
var2 = 6:10,
var4 = 20:24)
我目前在主链接变量上合并这些数据集:
merge1 <- merge(x = df1,
y = df2,
by = 'id',
all = TRUE)
我需要重新合并第一个数据帧中具有第二个 id 但在初始合并中不匹配的行,因此我将它们放在单独的数据帧中,将它们从完全匹配的数据集中取出,然后将两者合并:
df1.remerge <- merge1[which(!is.na(merge1$id2) &
is.na(merge1$var2)),]
df1.remerge$id <- df1.remerge$id2
merged <- merge1[which(is.na(merge1$id2) |
!is.na(merge1$var2)),]
merge2 <- merge(x = df1.remerge,
y = merged,
by = 'id',
all = TRUE,
suffixes = c('.m1', '.m2'))
# where .m1 = the remerged obs from df1 & .m2 = the original merged obs
不过,这会创建两组相同的变量(即,我最终得到两个 var1s 和两个 var2s)。我当然可以手动组合变量,但我不希望这样做,因为我的实际数据非常大(想想数百万个观察值和 30-40 个变量),而且效率似乎相当低。
最终我想要一个大致如下所示的数据集:
want.final <- data.frame(id = c('a', 'b', 'c', 'd', 'e'),
var1 = 1:5,
var2 = 6:10,
var3 = c('hi', 'hello', 'bonjour', 'howdy', 'hi'),
var4 = 20:24)
但是我用这种方法得到的是这样的:
get.final <- data.frame(id = c('a', 'b', 'c', 'd', 'e'),
var1.m1 = c('NA', 'NA', 'NA', 4, 5),
var1.m2 = c(1, 2, 3, 'NA', 'NA'),
var2.m1 = c('NA', 'NA', 'NA', 'NA', 'NA'),
var2.m2 = c(6, 7, 8, 9, 10),
var3.m1 = c('NA', 'NA', 'NA', 'howdy', 'hi'),
var3.m2 = c('hi', 'hello', 'bonjour', 'NA', 'NA'),
var4.m1 = c('NA', 'NA', 'NA', 'NA', 'NA'),
var4.m2 = c(20, 21, 22, 23, 24))
有没有人知道一种方法来重新合并这些观察结果并更新它们在 master/x 数据集中缺失而在 using/y 中没有缺失的现有变量?在一个理想的世界中,我想要像 Stata 的 merge 的 update 选项这样的东西。
【问题讨论】:
-
预期输出是多少?如果您可以像
df1和df2那样使用data.frame(..)构建它,那将是理想的。谢谢! -
刚刚更新——如果还不清楚,请告诉我。
-
即使有数百万行,它也总是只有两个变量,或者您是否需要一种编程方法,用两个以上的
id*变量重复这个过程? -
这只是两个
id变量,谢天谢地
标签: r dataframe data-structures merge