Str_split 只返回字符串的一半
Str_split is returning only half of the string
我有一个小标题,小标题中的向量是混合了英文和普通话字符的字符串。我想将 tibble 分成两列,一列 return 英文,另一列 return 中文。但是,我不得不求助于以下代码来完成此操作:
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 行来 return 两列。
我们可以使用str_match
,分别获取英文和其余字符的数据。
stringr::str_match(tb$x, "([A-Za-z]+)(.*)")[, -1]
# [,1] [,2]
#[1,] "I" "我"
#[2,] "love" "愛"
#[3,] "you" "你"
使用包 stringr
中的 str_extract
的简单解决方案:
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)
另一种解决方案使用 [ -~]+
处理 unicode 字符,并使用 [^ -~]+
:
排除它们
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 你
我们可以使用 base R
中的 strsplit
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:]]+")
我有一个小标题,小标题中的向量是混合了英文和普通话字符的字符串。我想将 tibble 分成两列,一列 return 英文,另一列 return 中文。但是,我不得不求助于以下代码来完成此操作:
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 行来 return 两列。
我们可以使用str_match
,分别获取英文和其余字符的数据。
stringr::str_match(tb$x, "([A-Za-z]+)(.*)")[, -1]
# [,1] [,2]
#[1,] "I" "我"
#[2,] "love" "愛"
#[3,] "you" "你"
使用包 stringr
中的 str_extract
的简单解决方案:
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)
另一种解决方案使用 [ -~]+
处理 unicode 字符,并使用 [^ -~]+
:
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 你
我们可以使用 base R
strsplit
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:]]+")