【问题标题】:How to extract numbers in a text row and seperate by a delimiter如何提取文本行中的数字并用分隔符分隔
【发布时间】:2019-09-20 04:25:08
【问题描述】:

我目前正在提取出现在如下字符串中的所有数字:

    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 。最终我需要从这些评论中获取时间窗口。这种方法好吗?

【问题讨论】:

  • @Anony-MousseI 我只是一个初学者,你能指导我什么是最好的方法吗?
  • 我认为根本没有处理此类数据的好方法。这些值具有非常不同的语义。为什么你不能让它们保持原样?你到底打算怎么做?
  • @Anony-Mousse 我需要根据他们指定的时间提取时间窗口。就像下午 2 点之前 = 08:00-14:00 1.30-2pm =13:30-14:00。那么它将是结构化格式,易于进行进一步分析
  • 但您可能不想失去“下午 2 点之前”和“下午 2 点之后”之间的区别...

标签: r gsub


【解决方案1】:

您可以使用 str_extract_all 提取每个字符串中的所有数字,然后如果您希望将它们放在一个由 _ 分隔的字符串中,您可以使用带有 _ 的 paste 作为折叠参数。我认为这不会帮助您获得时间段,但您需要对条目可能采用的模式进行一些假设。

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

【讨论】:

    【解决方案2】:

    使用链式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"
    

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2012-05-20
      • 1970-01-01
      • 2016-07-15
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多