gpt4 book ai didi

r - 合并/加入优先考虑非缺失值

转载 作者:行者123 更新时间:2023-12-04 12:32:31 29 4
gpt4 key购买 nike

是否有一个合并函数可以优先考虑公共(public)变量中的非缺失值?

考虑以下示例。

首先,我们生成两个 data.frames,它们具有相同的 ID,但在特定变量上有互补的缺失值:

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)

应用 mergedplyr 包中的任何 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

我们想以一种“更智能”的方式连接这两个数据帧,忽略一个数据帧中的缺失值,而另一个数据帧中没有缺失值,以获得以下输出:

> 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

我们可以假设 df1df2 具有完全互补的 V1 缺失值。

编辑

理想的解决方案适用于任意数量的变量。

最佳答案

感谢@Gregor 和@StevenBeaupré 的非常有用的评论,我想出了一个解决方案,使用 kimisc 包中的 coalesce.na 扩展到任意数量的变量:

mapply(function(x,y) coalesce.na(x,y), df1$V1, df2$V1)
[1] -1.5399500 1.3297993 0.4146414 -0.9285670 -0.2947204 1.2724293

请注意 df1$V1df2$V1 可以替换为变量列表,允许这样的事情:

> set.seed(1)
> missings <- sample.int(6, 3)
> df1 <- data.frame(ID = letters[1:6],
+ V1 = NA,
+ V2 = NA)
> df2 <- data.frame(ID = letters[1:6],
+ V1 = NA,
+ V2 = NA)
> df1$V1[missings] <- rnorm(3)
> df2$V1[setdiff(1:6, missings)] <- rnorm(3)
> df1$V2[setdiff(1:6, missings)] <- rnorm(3)
> df2$V2[missings] <- rnorm(3)

> cbind(df1, df2)
ID V1 V2 ID V1 V2
1 a NA -0.005767173 a -1.5399500 NA
2 b 1.3297993 NA b NA -0.7990092
3 c 0.4146414 NA c NA -0.2894616
4 d NA 2.404653389 d -0.9285670 NA
5 e NA 0.763593461 e -0.2947204 NA
6 f 1.2724293 NA f NA -1.1476570

> dfMerged <- merge(df1, df2, by = 'ID')
> xList <- dfMerged[grep("\\.x$", names(dfMerged))]
> yList <- dfMerged[grep("\\.y$", names(dfMerged))]

> mapply(function(x,y) coalesce.na(x,y), xList, yList)
V1.x V2.x
[1,] -1.5399500 -0.005767173
[2,] 1.3297993 -0.799009249
[3,] 0.4146414 -0.289461574
[4,] -0.9285670 2.404653389
[5,] -0.2947204 0.763593461
[6,] 1.2724293 -1.147657009

一个完整的解决方案看起来像这样:

library(kimisc)
smartMergeList <- function(dfList, idVar) {
merged <- Reduce(x = dfList,
f = function(x,y) merge(x, y, by = idVar, all = T))
xList <- merged[grep("\\.x$", names(merged))]
yList <- merged[grep("\\.y$", names(merged))]
merged[names(xList)] <- mapply(function(x,y) coalesce.na(x,y),
xList, yList)
merged[names(yList)] <- NULL
merged
})

不过我还是希望看到更漂亮的东西!

关于r - 合并/加入优先考虑非缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37714533/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com