Мы указываем 'n', после разделения столбца character
на '_', извлекаем n-1
первые компоненты
n <- 4
lapply(strsplit(as.character(df$Name), "_"), `[`, seq_len(n - 1))
Если нам нужно paste
, то вместе, можно использовать вызов анонимной функции (function(x)
) после зацикливания list
с lapply/sapply
, получение первых n элементов с head
и paste
их вместе`
sapply(strsplit(as.character(df$Name), "_"), function(x)
paste(head(x, n - 1), collapse="_"))
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"
Или используйте метод регулярных выражений
sub("^([^_]+_[^_]+_[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"
Или, если 'n' действительно большое, то
pat <- sprintf("^([^_]+){%d}[^_]+).*", n-1)
sub(pat, "\\1", df$Name)
или
sub("^(([^_]+_){2}[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"