Je fais un fuzzy_full_join de deux tables dans R nécessitant plusieurs clés pour correspondre. Certains les lignes ne correspondent pas. La sortie a dupliqué les clés. Cela n'arrive pas avec une jointure complète non floue. Quelle est la meilleure façon de supprimer les doublons ? je avoir une solution, mais cela semble lourd.

Exemple:


x<-data.frame("id"=c(1,1,2,2), "time" = c(1,2,1,2), "meas1" = c(1,2,3,4))
y<-data.frame("id"=c(1,1,2,2), "time" =c(1,3,2,4),"meas2"=c(-1,-2,-3,-4))

# compare full_join output with fuzzy_full_join
full_join(x,y,by=c('id'='id','time'='time')) 
fuzzy_full_join(x,y,by=c('id'='id','time'='time'),match_fun=list(`==`,`==`))

# make fuzzy_full_join output match full_join output
fuzzy_full_join(x,y,by=c('id'='id','time'='time'),match_fun=list(`==`,`==`)) %>%
  mutate(id=if_else(is.na(id.x),id.y,id.x)) %>%
  select(-id.x,-id.y) %>%
  mutate(time=if_else(is.na(time.x),time.y,time.x)) %>%
  select(-time.y,-time.x)
0
user98563 11 févr. 2020 à 01:31

1 réponse

Meilleure réponse

Nous pouvons utiliser coalesce qui pourrait aider à réduire le code.

library(dplyr)
library(fuzzyjoin)

fuzzy_full_join(x,y,by=c('id'='id','time'='time'),match_fun=list(`==`,`==`)) %>%
  mutate(id=coalesce(id.x, id.y), time = coalesce(time.x, time.y)) %>%
  select(-matches('\\.x$|\\.y$'))

#  meas1 meas2 id time
#1     1    -1  1    1
#2     4    -3  2    2
#3     2    NA  1    2
#4     3    NA  2    1
#5    NA    -2  1    3
#6    NA    -4  2    4
1
Ronak Shah 11 févr. 2020 à 03:54