2016-09-14 5 views
1

私は、数千の異なるロケーション(都市)名を持つカラムを持つ大きなデータフレームを持っています。データクリーニング - FindReplace関数を意図した通りに動作させることができません

非常に戦って正規表現とループでそれをやろうとしたら、私はDataCombineパッケージとFindReplaceを見つけましたが、これは私が望むことをするためのものですが、動作させることはできません。

だから私はしている:

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 

クリーニングだけで、例えば、置き換えています「London Chelsea」は「London」、「Brooklyn」は「New York City」、「Paris 20e」、「Paris-14」は「Paris」でなければなりません。さらに進めるには、パターン "Paris"を持つすべてのものを "Paris"(SQLではLIKE "Paris%"のようなもの)に置き換えてください。

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 
部分的に清掃

(文字列が置き換えられている)ではなく、全体のエントリ:

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

そして関数は、これを返します。

どうすればいいですか? grepでループしますか?一致?または、本当に必要なすべてのエントリを含むクリーニングデータフレームを作成する必要がありますか。

+0

引数 'replaceData'は' cleaner'ではなく 'should_be'でなければなりませんか? – aichao

+0

あなたは正しいです、この変更は機能を意図したとおりに動作させます。しかし、 "Paris-20"のように、パターンを持つエントリをクリーンアップするわけではありません。 "Paris-20"と​​置き換えることはできません。 –

+0

申し訳ありませんが、あなたを助けることはできません。私は実際に 'DataCombine :: FindReplace'を使用していません。 – aichao

答えて

0

合体。

# 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). 
関連する問題