【发布时间】:2016-10-09 10:22:06
【问题描述】:
是否有一个合并函数可以优先处理公共变量中的非缺失值?
考虑以下示例。
首先,我们生成两个具有相同 ID 但在特定变量上具有互补缺失值的 data.frame:
set.seed(1)
missings <- sample.int(6, 3)
df1 <- data.frame(ID = letters[1:6], V1 = NA)
df2 <- data.frame(ID = letters[1:6], V1 = NA)
df1$V1[missings] <- rnorm(3)
df2$V1[setdiff(1:6, missings)] <- rnorm(3)
应用 merge 或 dplyr 包中的任何 join 函数会产生类似于以下的结果:
> merge(df1, df2, by = 'ID')
ID V1.x V1.y
1 a NA -1.5399500
2 b 1.3297993 NA
3 c 0.4146414 NA
4 d NA -0.9285670
5 e NA -0.2947204
6 f 1.2724293 NA
我们希望以一种“更智能”的方式连接这两个 data.frame,在一个 data.frame 中没有缺失值时忽略另一个 data.frame 中的缺失值,以获得以下输出:
> output <- df1
> output$V1[is.na(df1$V1)] <- df2$V1[!(is.na(df2$V1))]
> output
ID V1
1 a -1.5399500
2 b 1.3297993
3 c 0.4146414
4 d -0.9285670
5 e -0.2947204
6 f 1.2724293
我们可以假设df1 和df2 具有完全互补的缺失值V1。
编辑
适用于任意数量变量的解决方案将是理想的。
【问题讨论】:
-
但是如果它们不是互补的呢?如果 ID 确实 在 df1 和 df2 中都有非缺失值,您是要保留两者还是优先考虑一个? SQL 通常会让您使用
coalesce函数 - see here for implementations ofcoalescein R 对其中一个进行优先级排序。当然,如果它们也是互补的,它仍然可以工作。 -
@Gregor
dplyr的开发版本有一个coalsece的实现,所以你可以简单地做dplyr::coalesce(df1, df2): -
正确——在这种情况下,您会想要保留两者。这不是我的情况,但
coalesce听起来不错——谢谢你们。也许一个更一般(更好?)的问题会问如何实现基于某种条件选择两个值之一的合并,而不仅仅是缺失... -
@Gregor 明白了。想到的问题是可能有很多这样的变量(我目前的情况),自动化合并会很棒!
-
这很好。在这种情况下,尽管当您没有真正加入
na.omit(rbind(df1, df2))之类的东西时也可以正常工作(相当于merge(na.omit(df1), na.omit(df2), by = 'ID'),您或多或少会显示)。不知道为什么这种方法不能令人满意。您想保留的其他列中是否存在潜在缺失值?
标签: r join dataframe merge dplyr