Вы можете найти первый шаблон , используя ^510
, ^650
и ^707
.Чтобы легко добавить новый столбец, я использовал dplyr
пакет.
library(tidyverse) # has dplyr and stringr
# data set -------------------------------
(dirt <- data_frame(PhoneNumbers = c("510-548-2238", "707-231-2440", "650-752-1300", "510-674-3482", "510-853-5695", "510-882-9898", "650-555-6311", "707-885-6351", "650-231-1234", "650-096-0023", "707-691-6763")))
#> # A tibble: 11 x 1
#> PhoneNumbers
#> <chr>
#> 1 510-548-2238
#> 2 707-231-2440
#> 3 650-752-1300
#> 4 510-674-3482
#> 5 510-853-5695
#> 6 510-882-9898
#> 7 650-555-6311
#> 8 707-885-6351
#> 9 650-231-1234
#> 10 650-096-0023
#> 11 707-691-6763
Вы можете создать функцию для поиска каждого региона, найдя каждый шаблон: stringr::str_detect()
Вы можете сделать это водин раз используя sapply()
.Если вы выполните от str_detect
до c("^510", "^650", "^707")
, вы получите матрицу, каждый столбец которой является номером.Каждое значение определяет, содержит ли число шаблон (TRUE
или FALSE
), то есть 11 x 3.
Для каждой строки у вас есть только один TRUE
по построению.Вы можете найти этот индекс и подмножество c("KANSAS", "TEXAS", "NEW YORK")
.
find_region <- function(x) {
sta <- c("^510", "^650", "^707")
stt <- sapply(sta, function(p) {
str_detect(x, pattern = p)
}) %>% # produce matrix 11x3 of TRUE and FALSE, each column = 510, 650, 707, TRUE if x contains the pattern
apply(1, which) # get the index
c("KANSAS", "TEXAS", "NEW YORK")[stt]
}
Используя эту функцию, вы можете добавить новый столбец: dplyr::mutate()
dirt %>%
mutate(State = find_region(PhoneNumbers))
#> # A tibble: 11 x 2
#> PhoneNumbers State
#> <chr> <chr>
#> 1 510-548-2238 KANSAS
#> 2 707-231-2440 NEW YORK
#> 3 650-752-1300 TEXAS
#> 4 510-674-3482 KANSAS
#> 5 510-853-5695 KANSAS
#> 6 510-882-9898 KANSAS
#> 7 650-555-6311 TEXAS
#> 8 707-885-6351 NEW YORK
#> 9 650-231-1234 TEXAS
#> 10 650-096-0023 TEXAS
#> 11 707-691-6763 NEW YORK