Как извлечь единицу, перед которой стоит число, с помощью str_extract? - PullRequest
0 голосов
/ 09 марта 2020

Я думаю, что str_extract может сделать это, но я не могу понять это. мои данные содержат китайский символ, поэтому между символами нет белого цвета. Я моделирую данные в engli sh как:

> dd<-c("wwe12hours,fgg23days","ffgg12334hours,23days","ffff1days")
> target <- c("hours","days","hours","days")
> target
[1] "hours" "days"  "hours" "days" 

Как мне достичь цели ? мой реальный случай:

> dd <- c("腹痛发热12小时,再发2天","腹痛132324月,再发1天","发热4天")
> target <- c("小时","月","天")
> target
[1] "小时" "月"   "天"   

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

Кажется, вы ищете регулярное выражение для захвата юнитов. Поскольку у вас есть вектор длины три, мы бы предпочли вернуть еще один вектор длины три. Из вашего примера (ENGLI SH ONE) не ясно, как вы получаете цель в 4 единицы. Хотя я чувствую, что вы имели в виду 5, а не 3.

, вот как вы можете решить. Обычно это может использоваться для любого языка:

Engli sh:

gsub("\\p{L}*+\\d+", "", dd, perl = TRUE)
[1] "hours,days" "hours,days" "days"   

Китайский:

gsub("\\p{L}*+\\d+", "", dd, perl = TRUE)
[1] "小时,天" "月,天"   "天"     

regmatches(ddc,gregexpr("(?<=\\d)\\p{L}+",ddc,perl = TRUE))
[[1]]
[1] "小时" "天"  

[[2]]
[1] "月" "天"

[[3]]
[1] "天"

или если вы хотите использовать другие пакеты:

с использованием str_extract_all:

library(stringr)
str_extract_all(ddc,"(?<=\\d)\\p{L}+")
1 голос
/ 09 марта 2020

Вы можете использовать str_match_all:

library(stringr)
unlist(sapply(str_match_all(dd, '\\d+(\\w+)'), function(x) x[, 2]))
#[1] "hours" "days"  "hours" "days"  "days" 

Это захватывает первое слово, которое следует за числом.

где

str_match_all(dd, '\\d+(\\w+)') #returns
#[[1]]
#     [,1]      [,2]   
#[1,] "12hours" "hours"
#[2,] "23days"  "days" 

#[[2]]
#     [,1]         [,2]   
#[1,] "12334hours" "hours"
#[2,] "23days"     "days" 

#[[3]]
#     [,1]    [,2]  
#[1,] "1days" "days"

Как уже упоминалось @Onyambu, мы можем использовать регулярное выражение lookbehind, чтобы избежать использования sapply для подмножества группы захвата.

unlist(str_extract_all(dd,"(?<=\\d)[A-z]+"))
0 голосов
/ 09 марта 2020

Базовый раствор R:

cleaned_dd <- gsub("[[:punct:]].*", "",
                   unlist(lapply(strsplit(
                     gsub("[[:digit:]]", " ", dd), "\\s+"
                   ), '[',-1)))
...