Agak susah dijelaskan, tapi saya coba bandingkan kolom "cpf" dari dua frame data yang berbeda. Saya ingin mengidentifikasi kapan nilai dalam dua kolom "cpf" dari (df1) dan (df2) sama (nilai ini dapat berada di baris yang berbeda). Setelah itu, saya ingin memperbarui nilai NA jika ini tersedia dari bingkai data lain.

df1 
    cpf x  y
1   21  NA NA
2   32  NA NA
3   43  NA NA
4   54  NA NA
5   65  NA NA

df2 
    cpf x  y
1   54  5  10
2   0   NA NA
3   65  3   2
4   0   NA NA
5   0  NA NA

Saya ingin hasil berikut

df3 
    cpf x  y
1   21  NA NA
2   32  NA NA
3   43  NA NA
4   54  5  10
5   65  3   2
4
Marcos O. C. Alves 12 Mei 2021, 05:18

2 jawaban

Jawaban Terbaik

Kita bisa melakukan join pada 'cpf' dan menggunakan fcoalecse

library(data.table)
setDT(df1)[df2, c('x', 'y') := .(fcoalesce(x, i.x), 
        fcoalesce(y, i.y)), on = .(cpf)]

-keluaran

df1
#   cpf  x  y
#1:  21 NA NA
#2:  32 NA NA
#3:  43 NA NA
#4:  54  5 10
#5:  65  3  2

Atau menggunakan coalecse dari dplyr setelah left_join

library(dplyr)
left_join(df1, df2, by = 'cpf') %>%
     transmute(cpf, x = coalesce(x.x, x.y), y = coalesce(y.x, y.y))
#  cpf  x  y
#1  21 NA NA
#2  32 NA NA
#3  43 NA NA
#4  54  5 10
#5  65  3  2

Dalam base R, dapat menggunakan match

i1 <- match(df1$cpf, df2$cpf, nomatch = 0)
i2 <- match(df2$cpf, df1$cpf, nomatch = 0)
df1[i2, -1] <- df2[i1, -1]

Data

df1 <- structure(list(cpf = c(21L, 32L, 43L, 54L, 65L), x = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_), y = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_)), row.names = c("1", 
"2", "3", "4", "5"), class = "data.frame")

df2 <- structure(list(cpf = c(54L, 0L, 65L, 0L, 0L), x = c(5L, NA, 3L, 
NA, NA), y = c(10L, NA, 2L, NA, NA)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))
3
akrun 12 Mei 2021, 02:32
df1 %>% 
  left_join(df2, by = "cpf") %>% 
  select(cpf, x = x.y, y = y.y)

Keluaran:

  cpf  x  y
1  21 NA NA
2  32 NA NA
3  43 NA NA
4  54  5 10
5  65  3  2
2
TarJae 12 Mei 2021, 02:37