Удалить строку с n-го последнего разделителя до конца

У меня есть следующая строка:

data_string = c("Aa_Bbbbb_0_ID1",
                "Aa_Bbbbb_0_ID2",
                "Aa_Bbbbb_0_ID3",
                "Ccccc_D_EEE_0_ID1")

Я просто хотел разделить всю строку, чтобы получить следующие результаты:

"Aa_Bbbbb"
"Aa_Bbbbb"
"Aa_Bbbbb"
"Ccccc_D_EEE"

В общем, я ищу функцию, которая берет data_string, устанавливает разделитель и занимает позицию разделения:

remove_tail(data_table, sep = '_', del = 2)

только удаление хвоста от 2-го последнего разделителя до конца строки (не разделять всю строку)


person Olorin.G    schedule 06.04.2017    source источник
comment
Почему бы не разделить на "_", а затем вставить обратно первые 2? Или разделить на "_0_" ?   -  person zx8754    schedule 06.04.2017
comment
Мой пример был неверным. Я только что исправил это; вы можете видеть, что ваше первое решение не работает, если есть "A_B_C_D_0_ID3". да, spli на "_0_" работает нормально, но я не уверен, что у меня всегда будет этот флаг в строке   -  person Olorin.G    schedule 06.04.2017


Ответы (3)


Попробуйте ниже:

# split on "_" then paste back removing last 2
sapply(strsplit(data_string, "_", fixed = TRUE),
       function(i) paste(head(i, -2), collapse = "_"))

Мы можем сделать нашу собственную функцию:

# custom function
remove_tail <- function(x, sep = "_", del = 2){
  sapply(strsplit(x, split = sep, fixed = TRUE),
         function(i) paste(head(i, -del), collapse = sep))
  }

remove_tail(data_string, sep = '_', del = 2)
# [1] "Aa_Bbbbb"    "Aa_Bbbbb"    "Aa_Bbbbb"    "Ccccc_D_EEE"
person zx8754    schedule 06.04.2017

Использование gsub

gsub("_0_.*","",data_string)

person Erdem Akkas    schedule 06.04.2017

Мы также можем использовать sub tp, чтобы соответствовать _, за которым следует одна или несколько цифр (\\d+) и остальные символы, замените его пробелом ("")

sub("_\\d+.*", "", data_string)
#[1] "Aa_Bbbbb"    "Aa_Bbbbb"    "Aa_Bbbbb"    "Ccccc_D_EEE"
person akrun    schedule 06.04.2017