Как извлечь числа в текстовой строке и разделить их разделителем - PullRequest
0 голосов
/ 20 сентября 2019

Я в настоящее время извлекаю все числа, появляющиеся в строке, как показано ниже:

    library(data.table)
    library(stringr)

    Data<-data.table(
    X=sample(1:10),
    Y=c("before 10 pm","1-3 am","at 3pm","after 4pm","on 12:00am","at 16:00","between 12-12:30","at 1PM","1.30-2pm","11.00AM - 1.00PM")
    )
    fun1<-function(x){
    ge<-gregexpr("(^-?|(?<=\\D)-)?(\\d\\.?\\d*?)+",x,perl=T)
    return(as.numeric(sapply(regmatches(x,ge),paste0,collapse="")))
    }

    Data[,parsed:=lapply(Y,fun1)]

Но это извлекает числа, и мне нужно разделить их разделителем. Например, 1.30-2pm должны быть проанализированы в 1_30_2В конце концов мне нужно получить временное окно из этих обзоров.Этот подход хорош?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Использование цепочек gsub.

gsub("_$", "", gsub("\\D*(\\d+)\\D*", "\\1_", Data$Y))
# [1] "10"         "1_3"        "3"          "4"          "12_00"      "16_00"     
# [7] "12_12_30"   "1"          "1_30_2"     "11_00_1_00"
1 голос
/ 20 сентября 2019

Вы можете использовать str_extract_all для извлечения всех чисел в каждой строке, затем, если вы хотите, чтобы они были объединены в одну строку, разделенную _, вы можете использовать вставку с _ в качестве аргумента свертывания.Я не думаю, что это поможет вам получить периоды времени, хотя вам потребуются некоторые предположения относительно шаблонов, которые могут быть использованы в записях.

Data[, parsed := sapply(str_extract_all(Y, '\\d+'), paste, collapse = '_')]

Data    
#      X                Y     parsed
#  1:  1     before 10 pm         10
#  2:  4           1-3 am        1_3
#  3:  3           at 3pm          3
#  4:  7        after 4pm          4
#  5:  2       on 12:00am      12_00
#  6:  8         at 16:00      16_00
#  7:  5 between 12-12:30   12_12_30
#  8:  6           at 1PM          1
#  9:  9         1.30-2pm     1_30_2
# 10: 10 11.00AM - 1.00PM 11_00_1_00
...