2016-07-08 2 views
0

Скажет, у меня есть вектор символов, как:R: доступ к последнему подэлементу каждого элемента в списке

x <- c('A__B__Mike','A__Paul','Daniel','A__B__C__Martha','A__John','A__B__C__D__Laura') 

Я хочу вектор только имена в последней позиции; Я предполагаю, что я мог сделать это удаление первого куска с помощью регулярных выражений, но сказать, что я хочу использовать strsplit(), чтобы разделить на «__»:

x.list <- strsplit(x, '__') 

Как бы я получить доступ к последнему подэлементу (имена) каждого элемент в этом списке? Я знаю только, как это сделать, если я знаю позицию:

sapply(x.list, "[[", 1) 

Но как получить доступ к последнему, когда позиция является переменной? Благодаря!

В любом случае, какой был бы самый быстрый способ извлечь имена из x в первую очередь? Что-нибудь быстрее, чем метод strsplit?

+1

Вместо 'sapply', вы можете использовать' mapply' применить на несколько объектов одновременно: 'mapply (\ '[[\', x.list, lengths (x.list)) '. Я думаю, что различные варианты ответа akrun хороши, если вы действительно заботитесь о скорости. – Frank

ответ

2

Мы можем сделать это с помощью base R. Либо с помощью sub

sub(".*__", "", x) 
#[1] "Mike" "Paul" "Daniel" "Martha" "John" "Laura" 

или strsplit, мы получаем последний элемент с tail

sapply(strsplit(x, '__'), tail, 1) 
#[1] "Mike" "Paul" "Daniel" "Martha" "John" "Laura" 

Или найти положение, мы можем использовать gregexpr, а затем извлечь с помощью substring

substring(x, sapply(gregexpr("[^__]+", x), tail, 1)) 
#[1] "Mike" "Paul" "Daniel" "Martha" "John" "Laura" 

Или с stri_extract_last

library(stringi) 
stri_extract_last(x, regex="[^__]+") 
#[1] "Mike" "Paul" "Daniel" "Martha" "John" "Laura" 
+0

Да! хвост - то, что я искал !! – DaniCee

2

Использование word функция stringr пакет

library(stringr) 
word(x,start = -1,sep = "\\_+") 

 Смежные вопросы

  • Нет связанных вопросов^_^