【问题标题】:Extracting string before a fixed character position在固定字符位置之前提取字符串
【发布时间】:2019-08-21 18:34:26
【问题描述】:

这是一个相当简单的问题,我尝试了多种组合,但我没有达到我想要达到的目标。 我有一个列,其中的语句用“-”分隔。我想从“-”的第四个实例之前提取单词 四月。

我正在使用此代码修剪第 4 个“-”之前的部分,并返回之后剩下的任何内容。

data$newCol1 <- NA 
data$newCol1 <- ifelse(data$date >= as.Date("2019-04-01"), sub(".?-.?-.?-.?-", "", data$Email), ifelse(data$date <= as.Date("2019-03-31"),data$Email,data$newCol1))

但是我想提取第 4 个“-”之前的部分,例如,如果这是我的字符串“19Q1-XYZ-JA-All-OutR-random-key-March”,我只想要 19Q1-XYZ-JA-All拥有 OutR-random-key-March 这是我目前得到的

这是我的数据集

Email                                           date
18Q4-ABC-SEA-CO-TM                              1/8/2019
19Q1-DEF-ABJPODTSST                             1/16/2019
19Q1-ABC-CMJ                                    2/8/2019
19Q1-APC-CORP                                   4/9/2019
19Q1-XYZ-ALP-SEA-MOO  ABc_1                     5/13/2019
19Q1-WXY-All-SF- Coral 01_24                    1/27/2019
19Q1-XYZ-All-SF-Tokyo SF Event 03_14 FINAL Send 3/14/2019
19Q1-XYZ-CN-All-cra-foo world-2901              1/30/2019
19Q1-XYZ-CN-All-get-foo world-2901              1/31/2019
19Q1-XYZ-CN-All-opc-foo world-2901              7/31/2019
19Q1-XYX-FI-AC-DEC-kites                        1/21/2019
19Q1-XYZ-JA-All-OutR-random-key-March           7/19/2019
19Q1-XYZ-JA-All-OutR-random-key-March           6/19/2019
19Q1-XYZ-JA-SF-OutR-RFC_ABS-key-March           3/29/2019
19Q1-XYZ-unavailable-random-key-balaji          4/20/2019

【问题讨论】:

  • 如果您已经展示了交叉比较的预期输出,那就太好了
  • 嗨,我有一个问题......我希望在新列中包含的部分是我要提取的部分,即“19Q1-XYZ-JA-All”这里用于条目2019 年 7 月 19 日
  • 好的,那么请检查我在下面发布的解决方案

标签: r substring


【解决方案1】:

一个选项是匹配3组不是-的字符,然后是-和下一组不是-([^-]+)的字符,作为一个组捕获并替换使用该捕获组的反向引用 (\\1)

data$date <- as.Date(data$date, "%m/%d/%Y")
data$newCol1 <- NA 
data$newCol1 <- ifelse(data$date >= as.Date("2019-04-01"), 
    sub("^(([^-]+-){3}[^-]+)-.*", "\\1", data$Email),
   ifelse(data$date <= as.Date("2019-03-31"),data$Email,data$newCol1))

数据

data <- structure(list(Email = c("18Q4-ABC-SEA-CO-TM", "19Q1-DEF-ABJPODTSST", 
"19Q1-ABC-CMJ", "19Q1-APC-CORP", "19Q1-XYZ-ALP-SEA-MOO  ABc_1", 
"19Q1-WXY-All-SF- Coral 01_24", "19Q1-XYZ-All-SF-Tokyo SF Event 03_14 FINAL Send", 
"19Q1-XYZ-CN-All-cra-foo world-2901", "19Q1-XYZ-CN-All-get-foo world-2901", 
"19Q1-XYZ-CN-All-opc-foo world-2901", "19Q1-XYX-FI-AC-DEC-kites", 
"19Q1-XYZ-JA-All-OutR-random-key-March", "19Q1-XYZ-JA-All-OutR-random-key-March", 
"19Q1-XYZ-JA-SF-OutR-RFC_ABS-key-March", "19Q1-XYZ-unavailable-random-key-balaji"
), date = c("1/8/2019", "1/16/2019", "2/8/2019", "4/9/2019", 
"5/13/2019", "1/27/2019", "3/14/2019", "1/30/2019", "1/31/2019", 
"7/31/2019", "1/21/2019", "7/19/2019", "6/19/2019", "3/29/2019", 
"4/20/2019")), class = "data.frame", row.names = c(NA, -15L))

【讨论】:

    【解决方案2】:

    一个简单的解决方案是使用?gregexpr 函数获取所有- 的位置,然后根据其位置提取字符串:

    我使用@akrun创建的数据

    result <- sapply(data$Email, function(x)substr(x, 1, gregexpr("-",x)[[1]][4]-1))
    
    result
    

    这将简单地生成 NA 值,因为某些字符串只有 3 个“-”,您可以简单地使用 if 条件修改代码以过滤它们。

    【讨论】:

    • 嗨,我只是想知道在这种语法中 grepexpr 是否识别“-”的位置,因为如果是这样,我正在考虑修改我的代码以检查“-”的日期和位置并因此执行提取。就像对于 3 "-" 我将按原样复制字符串,但对于 4 "-" 我将提取子字符串。
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2018-06-27
    • 2015-03-15
    • 2021-05-30
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多