Удалить символы из столбца 'n' символов после заданного условия в R - PullRequest
0 голосов
/ 28 июня 2018

Я хочу удалить все в этом столбце через 3 символа после '18'

MGL18JUNFUT
NATIONALUM18JUNFUT
NTPC18JUNFUT
ONGC18JUNFUT
PCJEWELLER18JUNFUT
PEL18JUNFUT
PFC18JUNFUT
PIDILITIND18JUNFUT
POWERGRID18JULFUT
PTC18JULFUT
RAYMOND18JULFUT
RBLBANK18JULFUT
RECLTD18JULFUT
RPOWER18JULFUT
MGL18JUN800PE

Я хочу, чтобы мой вывод выглядел как

MGL18JUN
NATIONALUM18JUN
NTPC18JUN
ONGC18JUN
PCJEWELLER18JUN
PEL18JUN
PFC18JUN
PIDILITIND18JUN
POWERGRID18JUL
PTC18JUL
RAYMOND18JUL
RBLBANK18JUL
RECLTD18JUL
RPOWER18JUL
MGL18JUN

Я попробовал следующий код.

output <- sub('(^.*?)18???.*', '' , df$column)

Но выход идет

8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUNFUT
8JUN800PE

Эквивалент Excel для этого есть.

=LEFT(A1, FIND("18",A1,1) +4)

Я пробовал много других опций, таких как sub, gregexpr, substr, но, похоже, ничего не работает

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

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

stringr::str_extract(string, "(.*)18\\w{3}")

Логика:

str_extract извлекает регулярное выражение (совпадение с регулярным выражением). Здесь я пытаюсь сопоставить все (используя. *, . означает любой символ и * соответствует нулю или более символов) до 18, затем извлекая 3 буквы (состоит из алфавитов и цифр, используя \ w с {3}), также пожалуйста Обратите внимание: если вы хотите, чтобы он извлекал от 1 до 3, вы можете использовать {m, n}, где m обозначает минимальное количество совпадений, а n - максимальное количество совпадений. Пример : \ w {2,3} будет соответствовать любой строке с 2 или 3 алфавитами и так далее. Вы можете использовать help(regex) для детального понимания того же. Благодарю. Я надеюсь, что это полезно.

Выход:

#> stringr::str_extract(string, "(.*)18\\w{3}")
# [1] "MGL18JUN"        "NATIONALUM18JUN" "NTPC18JUN"       "ONGC18JUN"      
# [5] "PCJEWELLER18JUN" "PEL18JUN"        "PFC18JUN"        "PIDILITIND18JUN"
# [9] "POWERGRID18JUL"  "PTC18JUL"        "RAYMOND18JUL"    "RBLBANK18JUL"   
# [13] "RECLTD18JUL"     "RPOWER18JUL"     "MGL18JUN" 

Введите:

string <- c("MGL18JUNFUT",
"NATIONALUM18JUNFUT",
"NTPC18JUNFUT",
"ONGC18JUNFUT",
"PCJEWELLER18JUNFUT",
"PEL18JUNFUT",
"PFC18JUNFUT",
"PIDILITIND18JUNFUT",
"POWERGRID18JULFUT",
"PTC18JULFUT",
"RAYMOND18JULFUT",
"RBLBANK18JULFUT",
"RECLTD18JULFUT",
"RPOWER18JULFUT",
"MGL18JUN800PE")

EDIT : -


Если у вас есть несколько 18-ых в ваших данных и вы хотите соответствовать до первых 18-ти, то вы можете остановить жадность символа регулярного выражения *, используя ?, как показано ниже:

stringr::str_extract(string, "(.*?)18\\w{3}")
0 голосов
/ 28 июня 2018

РЕДАКТИРОВАТЬ: Вы видели в разделе комментариев, что OP говорит, что OP нужно 3 символа после 1-го появления самого 18, тогда я предлагаю это регулярное выражение для того же времени.

x <- c("MGL18JUNFUT","NATIONALUM18JUNFUT18SHDGUDDG","NTPC18JUNFUT","ONGC18JUNFUT","PCJEWELLER18JUNFUT","PEL18JUNFUT","PFC18JUNFUT","PIDILITIND18JUNFUT","POWERGRID18JULFUT","PTC18JULFUT","RAYMOND18JULFUT","RBLBANK18JULFUT","RECLTD18JULFUT","RPOWER18JULFUT","MGL18JUN800PE")
> 
regmatches(x,regexpr("(.*?)18.{3}",x))

Вывод будет следующим.

> regmatches(x,regexpr("(.*?)18.{3}",x))
 [1] "MGL18JUN"        "NATIONALUM18JUN" "NTPC18JUN"       "ONGC18JUN"      
 [5] "PCJEWELLER18JUN" "PEL18JUN"        "PFC18JUN"        "PIDILITIND18JUN"
 [9] "POWERGRID18JUL"  "PTC18JUL"        "RAYMOND18JUL"    "RBLBANK18JUL"   
[13] "RECLTD18JUL"     "RPOWER18JUL"     "MGL18JUN"       
> 

Взяв пример вектора, вы также можете использовать фрейм данных здесь.

x <- c("MGL18JUNFUT","NATIONALUM18JUNFUT","NTPC18JUNFUT","ONGC18JUNFUT","PCJEWELLER18JUNFUT","PEL18JUNFUT","PFC18JUNFUT","PIDILITIND18JUNFUT","POWERGRID18JULFUT","PTC18JULFUT","RAYMOND18JULFUT","RBLBANK18JULFUT","RECLTD18JULFUT","RPOWER18JULFUT","MGL18JUN800PE")

Ниже приведен код для этого.

regmatches(x,regexpr("^.*18.{3}",x))

Вывод будет следующим.

> regmatches(x,regexpr("^.*18.{3}",x))
 [1] "MGL18JUN"        "NATIONALUM18JUN" "NTPC18JUN"       "ONGC18JUN"      
 [5] "PCJEWELLER18JUN" "PEL18JUN"        "PFC18JUN"        "PIDILITIND18JUN"
 [9] "POWERGRID18JUL"  "PTC18JUL"        "RAYMOND18JUL"    "RBLBANK18JUL"   
[13] "RECLTD18JUL"     "RPOWER18JUL"     "MGL18JUN"       
> 
0 голосов
/ 28 июня 2018

Мы могли бы изменить sub, захватив последовательность символов (.*, затем 18, а затем от нуля до трех символов (.{0,3} или, в частности, 3 символа (.{3})) в группе ((...)) и заменить на обратную ссылку (\\1) захваченной группы

sub("^(.*18.{0,3}).*", "\\1", df$column)

или

sub("^(.*18.{3}).*", "\\1", df$column)
#[1] "MGL18JUN"        "NATIONALUM18JUN" "NTPC18JUN"       "ONGC18JUN"      
#[5] "PCJEWELLER18JUN" "PEL18JUN"        "PFC18JUN"        "PIDILITIND18JUN"
#[9] "POWERGRID18JUL"  "PTC18JUL"        "RAYMOND18JUL"    "RBLBANK18JUL"   
#[13] "RECLTD18JUL"     "RPOWER18JUL"     "MGL18JUN"       

На основании комментариев ОП, если есть несколько экземпляров 18

v1 <- "PIDILITIND18JUN1180CE"
sub("^(.*?18.{3}).*", "\\1", v1)

Это также будет работать с начальными данными

sub("^(.*?18.{3}).*", "\\1", df$column)
#[1] "MGL18JUN"        "NATIONALUM18JUN" "NTPC18JUN"       "ONGC18JUN"      
#[5] "PCJEWELLER18JUN" "PEL18JUN"        "PFC18JUN"        "PIDILITIND18JUN"
#[9] "POWERGRID18JUL"  "PTC18JUL"        "RAYMOND18JUL"    "RBLBANK18JUL"   
#[13] "RECLTD18JUL"     "RPOWER18JUL"     "MGL18JUN"       

данные

df <- structure(list(column = c("MGL18JUNFUT", "NATIONALUM18JUNFUT", 
"NTPC18JUNFUT", "ONGC18JUNFUT", "PCJEWELLER18JUNFUT", "PEL18JUNFUT", 
"PFC18JUNFUT", "PIDILITIND18JUNFUT", "POWERGRID18JULFUT", "PTC18JULFUT", 
"RAYMOND18JULFUT", "RBLBANK18JULFUT", "RECLTD18JULFUT", "RPOWER18JULFUT", 
"MGL18JUN800PE")), .Names = "column", class = "data.frame",
row.names = c(NA, 
-15L))
...