Как разбить строку после n-го символа в r - PullRequest
1 голос
/ 06 февраля 2020

Я работаю со следующими данными:

District <- c("AR01", "AZ03", "AZ05", "AZ08", "CA01", "CA05", "CA11", "CA16", "CA18", "CA21")

Я хочу разбить строку после второго символа и поместить их в два столбца.

Чтобы данные выглядели так:

state  district
AR        01
AZ        03
AZ        05
AZ        08
CA        01
CA        05
CA        11
CA        16
CA        18
CA        21

Существует ли простой код для этого? Большое спасибо за вашу помощь

Ответы [ 4 ]

8 голосов
/ 06 февраля 2020

Вы можете использовать substr, если вы всегда хотите разделить на второй символ.

District <- c("AR01", "AZ03", "AZ05", "AZ08", "CA01", "CA05", "CA11", "CA16", "CA18", "CA21")
#split district  starting at the first and ending at the second
state <- substr(District,1,2)
#split district starting at the 3rd and ending at the 4th
district <- substr(District,3,4)
#put in data frame if needed.
st_dt <- data.frame(state = state, district = district, stringsAsFactors = FALSE)
4 голосов
/ 06 февраля 2020

вы можете использовать strcapture из базы R:

 strcapture("(\\w{2})(\\w{2})",District,
                    data.frame(state = character(),District = character()))
   state District
1     AR       01
2     AZ       03
3     AZ       05
4     AZ       08
5     CA       01
6     CA       05
7     CA       11
8     CA       16
9     CA       18
10    CA       21

, где \\w{2} означает два слова

1 голос
/ 07 февраля 2020

ОП имеет написано

Я более знаком с strsplit(). Но поскольку разделять не на что, в данном случае это не применимо

Au contraire! Есть что-то, на что можно разделить, и это называется lookbehind :

strsplit(District, "(?<=[A-Z]{2})", perl = TRUE) 

Внешний вид работает как " вставка невидимого разрыва " после 2 заглавных букв и разбивает там строки.

В результате получается список векторов

[[1]]
[1] "AR" "01"

[[2]]
[1] "AZ" "03"

[[3]]
[1] "AZ" "05"

[[4]]
[1] "AZ" "08"

[[5]]
[1] "CA" "01"

[[6]]
[1] "CA" "05"

[[7]]
[1] "CA" "11"

[[8]]
[1] "CA" "16"

[[9]]
[1] "CA" "18"

[[10]]
[1] "CA" "21"

, который можно превратить в матрицу, например,

do.call(rbind, strsplit(District, "(?<=[A-Z]{2})", perl = TRUE))
      [,1] [,2]
 [1,] "AR" "01"
 [2,] "AZ" "03"
 [3,] "AZ" "05"
 [4,] "AZ" "08"
 [5,] "CA" "01"
 [6,] "CA" "05"
 [7,] "CA" "11"
 [8,] "CA" "16"
 [9,] "CA" "18"
[10,] "CA" "21"
0 голосов
/ 06 февраля 2020

Мы можем использовать str_match для захвата первых двух символов и оставшейся строки в отдельных столбцах.

stringr::str_match(District, "(..)(.*)")[, -1]

#      [,1] [,2]
# [1,] "AR" "01"
# [2,] "AZ" "03"
# [3,] "AZ" "05"
# [4,] "AZ" "08"
# [5,] "CA" "01"
# [6,] "CA" "05"
# [7,] "CA" "11"
# [8,] "CA" "16"
# [9,] "CA" "18"
#[10,] "CA" "21"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...