2017-09-20 2 views
1

J'ai deux dataframes:valeur de retour non-correspondance comme-utilise qdaptools (recherche)

state = c("CA","WA","OR","AZ") 
first = c("Jim","Mick","Paul","Ron") 
df1 <- data.frame(first, state) 
df1 
    first state 
1 Jim CA 
2 Mick WA 
3 Paul OR 
4 Ron AZ 

newstate = c("TX", "LA") 
first =c("Jim","Mick") 
df2 <- data.frame(first,newstate) 
df2 
    first newstate 
1 Jim  TX 
2 Mick  LA 

Et je suis en utilisant la fonction qdaptools de recherche:

library(qdaptools) 
df1$match <- lookup(df1$first, df2[, 1:2]) 
> df1 
    first state match 
1 Jim CA TX 
2 Mick WA LA 
3 Paul OR <NA> 
4 Ron AZ <NA> 

Est-il possible d'ignorer nomatch ou avez nomatch renvoie la variable existante tel quel? Ce serait un exemple de résultat souhaité:

first state match 
1 Jim CA TX 
2 Mick WA LA 
3 Paul OR OR 
4 Ron AZ AZ 

Répondre

0

Une manière naïve est de remplacer les NA par une valeur d'état!

> state = c("CA","WA","OR","AZ") 
> first = c("Jim","Mick","Paul","Ron") 
> df1 <- data.frame(first, state, stringsAsFactors = F) 
> df1 
    first state 
1 Jim CA 
2 Mick WA 
3 Paul OR 
4 Ron AZ 
> 
> newstate = c("TX", "LA") 
> first =c("Jim","Mick") 
> df2 <- data.frame(first,newstate, stringsAsFactors = F) 
> df2 
    first newstate 
1 Jim  TX 
2 Mick  LA 
> 
> df3 <- merge(df1,df2, by='first', all=TRUE) 
> 
> #df3 <- as.character(df3) 
> 
> df3$newstate[is.na(df3$newstate)] <- df3$state[is.na(df3$newstate)] 
> 
> df3 
    first state newstate 
1 Jim CA  TX 
2 Mick WA  LA 
3 Paul OR  OR 
4 Ron AZ  AZ 
> 
0

Vous pouvez également utiliser dplyer:

library(tidyverse) 

df3 <- merge(x = df1, y = df2, all.x = TRUE) %>% 
    mutate(state = as.character(state), 
     newstate = as.character(newstate), 
     newstate = if_else(is.na(newstate), state, newstate)) 
1

Utilisation du package dplyr, vous pouvez faire le travail avec coalesce(). Ici, j'ai converti des facteurs en caractères. Si nécessaire, vous voulez les reconvertir en facteurs. La première étape consiste à fusionner les deux ensembles de données et à convertir le facteur en caractère. Ensuite, vous remplissez NAs dans newstate en utilisant coalesce().

library(dplyr) 

left_join(df1, df2, by = "first") %>% 
mutate_all(funs(as.character)) %>% 
mutate(newstate = coalesce(newstate, state)) 

# first state newstate 
#1 Jim CA  TX 
#2 Mick WA  LA 
#3 Paul OR  OR 
#4 Ron AZ  AZ