2016-07-08 105 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 = "\\_+") 
相關問題