gpt4 book ai didi

r - 合并 R 中的不同数据帧以消除 NA

转载 作者:行者123 更新时间:2023-12-02 15:56:01 24 4
gpt4 key购买 nike

我目前正在使用 R 开发纵向数据库。因此,我有很多缺失值,因为自上次采访以来一直未更改的变量值未添加到新数据库中。例如,在第一波中,性别被定义为男孩或女孩,并且在第一波和第二波之间没有变化,因此他们不会在第二波中再次给出性别。

基本上,我想做的是合并我为第二波选择的数据,并将其与第一波的数据合并,以消除一些 NA。但是,我只想保留我从第二波中选择的专栏。目前,在网上查看后,我只能合并这两个数据集,但不能只保留第二波的数据。

这是我的代码:

library("rqdatatable")

x <- data.frame(
ID = c(1,2,3,4),
S1 = c(1, 3, NA,0),
S2 = c(2, NA, 2,2)
)


y <- data.frame(
ID = c(1, 2, 3, 4,5,6,7,8),
S1 = c(1, 2, 5, 1,3,6,8,2),
S3 = c(3, 3, 3, 3,7,1,6,9),
S2 = c(0,0,0,0,0,0,0,0),
S4 = c(0,0,0,0,0,0,0,0)
)

final <- natural_join(x, y,
by = "ID",
jointype = "LEFT")

合并后我想得到的是:

    z = data.frame(
ID = c(1,2,3,4),
S1 = c(1, 3, 5,0),
S2 = c(2, 0, 2,2)
)

您知道如何解决我的问题吗?合并所有内容并再次选择我想要的变量将非常耗时。

非常感谢和最诚挚的问候!

最佳答案

这是一个基本的 r 函数,它像问题中那样连接数据。它也可以通过管道调用,在这种情况下,R 的管道运算符在 R 4.1 中引入。

x <- data.frame(
ID = c(1,2,3,4),
S1 = c(1, 3, NA,0),
S2 = c(2, NA, 2,2)
)

y <- data.frame(
ID = c(1, 2, 3, 4,5,6,7,8),
S1 = c(1, 2, 5, 1,3,6,8,2),
S3 = c(3, 3, 3, 3,7,1,6,9),
S2 = c(0,0,0,0,0,0,0,0),
S4 = c(0,0,0,0,0,0,0,0)
)


joinSpecial <- function(x, y, idcol = "ID"){
idcolx <- which(names(x) == idcol)
idcoly <- which(names(y) == idcol)
idx <- which(names(x) %in% names(y))
idy <- which(names(y) %in% names(x))
idx <- idx[idx != idcolx]
idy <- idy[idy != idcoly]
i <- match(x[[idcolx]], y[[idcoly]])
x[idx] <- mapply(\(a, b, i){
na <- is.na(a)
a[na] <- b[i][na]
a
}, x[idx], y[idy], MoreArgs = list(i = i), SIMPLIFY = FALSE)
x
}

joinSpecial(x, y)
#> ID S1 S2
#> 1 1 1 2
#> 2 2 3 0
#> 3 3 5 2
#> 4 4 0 2

x |> joinSpecial(y)
#> ID S1 S2
#> 1 1 1 2
#> 2 2 3 0
#> 3 3 5 2
#> 4 4 0 2

reprex package 创建于 2022-03-18 (v2.0.1)

关于r - 合并 R 中的不同数据帧以消除 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71531500/

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