Поиск в столбце из вектора строк с использованием R - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть столбец с адресом. Я хочу разобрать его и просто указать имя состояния. Ниже приведен мой столбец

structure(list(BreweryName = c("(512) Brewing Company", "0 Mile Brewing Company", 
"10 Barrel Brewing", "10 Barrel Brewing - Eastside Pub", "10 Barrel Brewing - Portland Pub", 
"10 Barrel Brewing Co."), BreweryAddress = c("407 Radam LnSte F200Austin, Texas, 78745-1197United States(512) 921-1545", 
"11 W 2nd StHummelstown, Pennsylvania, 17036-1506United States(717) 319-0133", 
"1501 E StSan Diego, California, 92101United States", "62950 NE 18th StBend, Oregon, 97701United States(541) 241-7733", 
"1411 NW Flanders StPortland, Oregon, 97209-2620United States(541) 585-1007", 
"830 W Bannock StBoise, Idaho, 83702-5857United States(208) 344-5870"
)), row.names = c(4L, 6L, 8L, 10L, 12L, 14L), class = "data.frame")

У меня есть еще один вектор, который я хочу сравнить и заменить.

v<- c("Texas","Pennsylvania","Oregon","Oregon","Idaho")

Я пытался использовать match и grep, но он вернулся с NA's.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Решение baseR с использованием regmatches, gregexpr

данных:

df1 <-
structure(list(BreweryName = c("(512) Brewing Company", "0 Mile Brewing Company", 
                               "10 Barrel Brewing", "10 Barrel Brewing - Eastside Pub", "10 Barrel Brewing - Portland Pub", 
                               "10 Barrel Brewing Co."), BreweryAddress = c("407 Radam LnSte F200Austin, Texas, 78745-1197United States(512) 921-1545", 
                                                                            "11 W 2nd StHummelstown, Pennsylvania, 17036-1506United States(717) 319-0133", 
                                                                            "1501 E StSan Diego, California, 92101United States", "62950 NE 18th StBend, Oregon, 97701United States(541) 241-7733", 
                                                                            "1411 NW Flanders StPortland, Oregon, 97209-2620United States(541) 585-1007", 
                                                                            "830 W Bannock StBoise, Idaho, 83702-5857United States(208) 344-5870"
                               )), row.names = c(4L, 6L, 8L, 10L, 12L, 14L), class = "data.frame")

v     <- c("Texas","Pennsylvania","Oregon","Oregon","Idaho")

код:

v_mod <- paste0(v, collapse="|")

df1$states <- sapply(regmatches(df1$BreweryAddress, gregexpr(v_mod, df1$BreweryAddress)), function(x){if(length(x)==0) NA else x})

результат:

#                        BreweryName                                                              BreweryAddress       states
#4             (512) Brewing Company    407 Radam LnSte F200Austin, Texas, 78745-1197United States(512) 921-1545        Texas
#6            0 Mile Brewing Company 11 W 2nd StHummelstown, Pennsylvania, 17036-1506United States(717) 319-0133 Pennsylvania
#8                 10 Barrel Brewing                          1501 E StSan Diego, California, 92101United States         <NA>
#10 10 Barrel Brewing - Eastside Pub              62950 NE 18th StBend, Oregon, 97701United States(541) 241-7733       Oregon
#12 10 Barrel Brewing - Portland Pub  1411 NW Flanders StPortland, Oregon, 97209-2620United States(541) 585-1007       Oregon
#14            10 Barrel Brewing Co.         830 W Bannock StBoise, Idaho, 83702-5857United States(208) 344-5870        Idaho
0 голосов
/ 26 сентября 2018

Вот решение tidyverse.Мы можем в основном объединить состояния в один шаблон с | в качестве разделителя, чтобы указать, что любой из них может быть опцией, а затем извлечь из столбца адреса.Это довольно грубо (что, если пивоваренный завод находится в Айдахо-авеню?), Но, в зависимости от ваших данных, этого, вероятно, достаточно.* (v0.2.0).

0 голосов
/ 26 сентября 2018

библиотека stringr имеет легкий подход для этого

v<- c("Texas","Pennsylvania","Oregon","Oregon","Oregon","Idaho")

library(stringr)
demographics$State <- str_extract(demographics$BreweryAddress,fixed(v, ignore_case=TRUE)) ##i have saved your data as demographics data frame. 
0 голосов
/ 26 сентября 2018

Вот базовая опция R с использованием grepl:

v <- c("Texas","Pennsylvania","Oregon","Oregon","Idaho")
states <- paste0("\\b", v, "\\b", collapse="|")
states

[1] "\\bTexas\\b|\\bPennsylvania\\b|\\bOregon\\b|\\bOregon\\b|\\bIdaho\\b"

df[grepl(states, df$BreweryAddress), ]

Я распечатал states, чтобы было ясно, какой шаблон регулярного выражения мы используем для поиска адресов пивоваренного завода.Мы используем чередование каждого имени состояния, заключенного в маркеры границы слова.Это гарантирует, что мы не совпадем случайно со строкой, в которой в качестве подстроки указано какое-то имя состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...