Почему я получаю этот нью-йоркский выход один? - PullRequest
0 голосов
/ 28 ноября 2018

Рассмотрим следующий вектор 'tels', который содержит телефонные номера из регионов “KANSAS”, “TEXAS” и “NEW YORK”.

tels <- 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 ") </p>

If the number starts with 510, the phone number is from “KANSAS”, if it is 707, then “NEW YORK” and if it is 650 then the number is from “TEXAS”

Use R concepts and obtain the following dataframe as ouput.

               Expected Output:

                  PhoneNumbers            State

               1     5105482238       KANSAS

               2     7072312440   NEW YORK

               3     6507521300          TEXAS

               4     5106743482       KANSAS

               5     5108535695       KANSAS

               6     5108829898       KANSAS

               7     6505556311         TEXAS

               8     7078856351   NEW YORK

               9     6502311234         TEXAS

               10   6500960023         TEXAS

               11   7076916763   NEW YORK



This is my code :

z<-substr(tels,1,3)
dirt<-data.frame(tels,z)
dirt
for(i in z){
  if(i==510){
    sta<-"ddfdd"
  }if(i==707){
    sta<-"NEW YORK"
  }
  if((i==650)){
    sta<-"TEXAS"
  }

}
das<-data.frame(tels,sta)
das


but I'm getting this output:
          tels      sta
1  510-548-2238 NEW YORK
2  707-231-2440 NEW YORK
3  650-752-1300 NEW YORK
4  510-674-3482 NEW YORK
5  510-853-5695 NEW YORK
6  510-882-9898 NEW YORK
7  650-555-6311 NEW YORK
8  707-885-6351 NEW YORK
9  650-231-1234 NEW YORK
10 650-096-0023 NEW YORK
11 707-691-6763 NEW YORK

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы можете использовать factor с метками state, а метки - первые 3 цифры

data.frame(tels,
 state = factor(substr(tels,0,3), c('510','650','707'), c('KANSAS','TEXAS','NEW YORK')))
           tels    state
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
0 голосов
/ 28 ноября 2018

Вы можете найти первый шаблон , используя ^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
0 голосов
/ 28 ноября 2018

Мы substr 'тели', а затем создаем именованный vector, чтобы соответствовать значениям substr и заменить его значениями в названном векторе

data.frame(PhoneNumbers = tels, state = setNames(c("KANSAS", "NEW YORK", "TEXAS"),
               c('510', '707', '650'))[substr(tels, 1, 3)])
#   PhoneNumbers    state
#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...