2016-09-14 2 views
1

Ich habe einen großen Datenrahmen mit einer Spalte, die tausende verschiedene Ortsnamen hat, und ich muss sie vereinfachen/bereinigen.Datenbereinigung - FindReplace-Funktion kann nicht wie vorgesehen funktionieren

Nachdem ich ziemlich viel gekämpft habe und versucht habe, es mit Regex und Loop zu tun, fand ich das DataCombine-Paket und das FindReplace, das tun soll, was ich will, aber ich kann es nicht schaffen.

Also ich habe:

UserId   Location 
1 USR_1    Paris 
2 USR_2   London 
3 USR_3   Londres 
4 USR_4   Neuilly 
5 USR_5   Berlin 
6 USR_6 London Chelsea 
7 USR_7 Berlin Schoenfeld 
8 USR_8   Paris-20 
9 USR_9   Neuilly 
10 USR_10  Friedrischain 

Die Reinigung nur ersetzen, z.B. "London Chelsea" sollte "London", "Brooklyn" sollte "New York City", "Paris 20e" und "Paris-14" sollte "Paris" sein. Um weiter zu gehen, möchte ich, dass alles, was das Muster "Paris" hat, durch "Paris" ersetzt wird (eine Art LIKE "Paris%" in SQL).

# Data for testing 
library(DataCombine) 
user_test <- data_frame(x <- paste("USR", as.character(1:10), sep = "_"), y <- c("Paris", "London", "Londres", "Neuilly", " Berlin", "London Chelsea", "Berlin Schoenfeld", "Paris-20", "Neuilly", "Friedrischain")) 
colnames(user_test) <- c("UserId","Location") 
user_test <- as.data.frame(user_test) ### Not sure why I have to put it there but otherwise it doesn't have the dataframe class 
should_be <- data_frame(c("Paris", "London", "Berlin", "Neuilly", "Friedr"), c("Paris", "London", "Berlin", "Paris", "Berlin")) 
colnames(should_be) <- c("is","should_be") 

# Calling the function 
FindReplace(data = user_test, Var = "Location", replaceData = should_be, from = "is", to = "should_be", exact = FALSE, vector = FALSE) 

und die Funktion gibt dies:

UserId   Location 
1 USR_1    Paris 
2 USR_2   London 
3 USR_3   Londres 
4 USR_4    Paris 
5 USR_5   Berlin 
6 USR_6 London Chelsea 
7 USR_7 Berlin Schoenfeld 
8 USR_8   Paris-20 
9 USR_9    Paris 
10 USR_10  Berlinischain 

teilweise gereinigt, aber nicht die ganzen Einträge (Strings ersetzt wurde).

Irgendwelche Ideen, wie ich tun könnte? Schleife mit Grep? Spiel? Oder muss ich wirklich einen Reinigungsdatenrahmen mit absolut allen gewünschten Einträgen erstellen.

+0

Sollte das Argument 'replaceData' nicht' sollte_be' sein statt 'cleaner'? – aichao

+0

Dank aichao hast du Recht, diese Änderung bewirkt, dass die Funktion wie beabsichtigt funktioniert. Aber es bereinigt nicht die Einträge, die das Muster haben, zum Beispiel in "Paris-20" ersetzt es es nicht mit "Paris". –

+0

Entschuldigung, ich kann Ihnen nicht helfen. Ich habe 'DataCombine :: FindReplace' eigentlich nie benutzt. – aichao

Antwort

0

Koaleszieren.

# Data for testing 
library(tidyverse) 

left_join(user_test, should_be, by = c("Location"="is")) %>% 
    mutate(final = coalesce(should_be, Location)) 

#> # A tibble: 10 x 4 
#> UserId Location   should_be final    
#> <chr> <chr>    <chr>  <chr>    
#> 1 USR_1 Paris    Paris  Paris    
#> 2 USR_2 London   London London   
#> 3 USR_3 Londres   <NA>  Londres   
#> 4 USR_4 Neuilly   Paris  Paris    
#> 5 USR_5 " Berlin"   <NA>  " Berlin"   
#> 6 USR_6 London Chelsea <NA>  London Chelsea 
#> 7 USR_7 Berlin Schoenfeld <NA>  Berlin Schoenfeld 
#> 8 USR_8 Paris-20   <NA>  Paris-20   
#> 9 USR_9 Neuilly   Paris  Paris    
#> 10 USR_10 Friedrischain  <NA>  Friedrischain 
Created on 2018-03-03 by the reprex package (v0.2.0). 
Verwandte Themen