2017-07-26 47 views
0

此問題涉及R.我有兩個dataframes,這個最小的可重複的例子表示:合併基於正則表達式的條件dataframes

a <- data.frame(geocode_selector = c("36005", "36047", "36061", "36081", "36085"), county_name = c("Bronx", "Kings", "New York", "Queens", "Richmond")) 
b <- data.frame(geocode = c("360050002001002", "360850323001019"), jobs = c("4", "204")) 

一個例子來幫助傳達我試圖執行非常具體的操作:geocode_selector數據幀中的列a包含紐約州五個區的FIPS縣代碼。數據框b中的geocode列是特定人口普查區塊的15位ID。一個geocode匹配的前五個數字更一般geocode_selector,說明人口普查塊位於其中縣。我想將列添加到b指定哪個縣每次普查塊落入下,基於其geocode_selector每個geocodeb比賽用。

通常,我試圖根據正則表達式條件合併數據框。理想情況下,我想進行全面合併,將a的所有列轉換爲b,而不僅僅是county_name

我試圖沿着線的東西:

b[, "county_name"] <- NA 
for (i in 1:nrow(b)) { 
    for (j in 1:nrow(a)) {. 
    if (grepl(data.a$geocode_selector[j], b$geocode[i]) == TRUE) { 
     b$county_name[i] <- a$county_name[j] 
    } 
    } 
} 

,但它採取了一個非常長的時間對大數據集的我其實處理和成品是不是我想要的。

任何有關如何根據正則表達式條件合併數據框的見解將非常感謝。

+2

'如果(... == TRUE)'是沒有意義的代碼:只寫'如果(...)',沒有必要*日益*寫'== TRUE':這是字面上'如果'已經。 –

回答

2

你可以這樣做......

b$geocode_selector <- substr(b$geocode,1,5) 
b2 <- merge(b, a, all.x=TRUE) #by default it will merge on common column names 

b2 
    geocode_selector   geocode jobs county_name 
1   36005 360050002001002 4  Bronx 
2   36085 360850323001019 204 Richmond 

如果你願意,你可以用b2[,1] <- NULL

0

刪除b2geocode_selector列,我們可以用sub創建「geocode_selector」,然後執行加入

library(data.table) 
setDT(a)[as.data.table(b)[, geocode_selector := sub('^(.{5}).*', '\\1', geocode)], 
        on = .(geocode_selector)] 
# geocode_selector county_name   geocode jobs 
#1:   36005  Bronx 360050002001002 4 
#2:   36085 Richmond 360850323001019 204 
0

這是一個很好的使用dplyr的機會。我也傾向於喜歡stringr中的字符串處理函數,如str_sub


library(dplyr) 
library(stringr) 

a <- data_frame(geocode_selector = c("36005", "36047", "36061", "36081", "36085"), 
       county_name = c("Bronx", "Kings", "New York", "Queens", "Richmond")) 
b <- data_frame(geocode = c("360050002001002", "360850323001019"), 
       jobs = c("4", "204")) 

b %>% 
    mutate(geocode_selector = str_sub(geocode, end = 5)) %>% 
    inner_join(a, by = "geocode_selector") 
#> # A tibble: 2 x 4 
#>   geocode jobs geocode_selector county_name 
#>    <chr> <chr>   <chr>  <chr> 
#> 1 360050002001002  4   36005  Bronx 
#> 2 360850323001019 204   36085 Richmond