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 

을 청소 그냥 교체되고, 예를 들어, "런던 첼시"는 "런던", "브루클린"은 "뉴욕시", "파리 20e"및 "파리 -14"는 "파리"여야합니다. 더 나아가서, "Paris"패턴이있는 모든 것을 "Paris"(SQL에서 LIKE "Paris %"와 같은)로 대체하고 싶습니다.

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

그리고 기능이 반환

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 

부분적으로 (문자열 대체되었습니다)하지만 정리되지 전체 항목.

내가 할 수있는 방법에 대한 아이디어가 있으십니까? grep으로 반복 하시겠습니까? 시합? 아니면 절대적으로 원하는 모든 항목으로 데이터 프레임을 정리해야합니다.

+0

'replaceData' 인수는'cleaner' 대신'should_be'가되어야합니까? – aichao

+0

감사합니다. aichao가 맞습니다.이 변경으로 인해 기능이 의도 한대로 작동합니다. 그러나 패턴이있는 항목은 지워지지 않습니다. 예를 들어 "Paris-20"에서는 "Paris"로 바뀌지 않습니다. –

+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).