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

Merging different data frames in R to eliminate NAs

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

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

这是我的代码:

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)
)

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

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

我们可以结合使用 inner_joincoalesce

library(dplyr)

x %>% 
  inner_join(y, by="ID") %>% 
  mutate(S1 = coalesce(S1.x, S1.y),
         S2 = coalesce(S2.x, S2.y)) %>% 
  select(ID, S1, S2)
  
  ID S1 S2
1  1  1  2
2  2  3  0
3  3  5  2
4  4  0  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 (v2.0.1)

创建于 2022-03-18