在固定字符位置之前提取字符串

时间:2019-08-21 18:34:26

标签: r substring

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

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

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))

但是我想提取第四个“-”之前的部分,例如,如果我的字符串“ 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

2 个答案:

答案 0 :(得分:0)

一个选项是匹配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))

答案 1 :(得分:0)

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

我使用@akrun创建的数据

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

result

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

相关问题