Str_split возвращает только половину строки - PullRequest
1 голос
/ 19 апреля 2020

У меня есть тиббл, а векторы внутри тиббла - это строки символов со смесью английских sh и мандаринских символов. Я хочу разделить тиббл на две части: одна колонка возвращает английский sh, а вторая - мандарин. Однако мне пришлось прибегнуть к следующему коду, чтобы выполнить sh this:

    tb <- tibble(x = c("I我", "love愛", "you你")) #create tibble
en <- str_split(tb[[1]], "[^A-Za-z]+", simplify = T) #split string when R reads a character that is not a-z
ch <- str_split(tb[[1]], "[A-Za-z]+", simplify = T) #split string after R reads all the a-z characters
tb <- tb %>%
  mutate(EN = en[,1],
         CH = ch[,2]) %>%
  select(-x)#subset the matrices created above, because the matrices create a column of blank/"" values and also remove x column
tb

Я предполагаю, что с моим RegEx что-то не так, что вызывает это. В идеале я хотел бы написать одну строку str_split, которая бы возвращала оба столбца.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Мы можем использовать str_match и получать данные для Engli sh и остальных символов отдельно.

stringr::str_match(tb$x, "([A-Za-z]+)(.*)")[, -1]

#     [,1]   [,2]
#[1,] "I"    "我"
#[2,] "love" "愛"
#[3,] "you"  "你"
1 голос
/ 19 апреля 2020

Мы можем использовать strsplit из base R

do.call(rbind, strsplit(tb$x, "(?<=[A-Za-z])(?=[^A-Za-z])", perl = TRUE))

Или мы можем использовать

library(stringr)
tb$en <- str_extract(tb$x,"[[:alpha:]]+")   
tb$ch <- str_extract(tb$x,"[^[:alpha:]]+")
1 голос
/ 19 апреля 2020

Простое решение с использованием str_extract из пакета stringr:

library(stringr)
tb$en <- str_extract(tb$x,"[A-z]+")   
tb$ch <- str_extract(tb$x,"[^A-z]")

В случае, если существует более одного китайского символа, просто добавьте + к [^A-z].

В качестве альтернативы используйте gsub и обратную ссылку:

tb$en <-  gsub("(\\w+).$", "\\1", tb$x)
tb$ch <-  gsub("\\w+(.$)", "\\1", tb$x)

Еще одно решение объединяет символы Юникод с [ -~]+ и исключает их с [^ -~]+:

tb$en <-  str_extract(tb$x, "[ -~]+")
tb$ch <-  str_extract(tb$x, "[^ -~]+")

Результат:

tb
# A tibble: 3 x 3
  x      en    ch   
  <chr>  <chr> <chr>
1 I我    I     我   
2 love愛 love  愛   
3 you你  you   你 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...