2017-01-05 26 views
2

的數據格式如下: 「性別Bornyear名國」 所以,列出的數據爲:如何從不同長度的每一個列表元素需要一個特殊的部分

[[1]] M-1900-Chambers-us 
[[2]] F-1900-Calin-Sanchez-es 
[[3]] M-1900-Aboul-Enein-us 
... 
... 

我嘗試使用

strsplit(as.charactoe(data), "\\-") 

但有些名字只是分成一部分,有些分成兩部分或三部分。 如果我只是想withdarw全國

split_data <- strsplit(as.charactoe(data), "\\-") 
lapply(split_data, function(x)x[length(x)]) 

這是最好的辦法嗎? 如果我想將名稱出來,那麼該怎麼辦?

+2

這當然不是一個「壞」的方式 - 這幾乎是我怎麼樣除了錯字'charactoe'和使用'tail,1'而不是'x [length(x)]'函數之外,請執行此操作。如果您有關於哪些部分與哪些字段相對應的規則,那麼您應該能夠調整代碼,以便按照您已經想出的方式採用前1或2次拆分,中間拆分集或最後一次拆分。 – thelatemail

+0

如果它總是一個兩字符的代碼,你可以在'nchar'中使用'substr',但它的複雜性大致相同。 – alistaire

+1

你也可以使用正則表達式:'sub('。*? - ([^ - ] + $)','\\ 1','M-1900-Aboul-Enein-us')'給出'us'。 – mt1022

回答

1

一些基準測試結果(所有的三個選項提取與提供的樣本數據中的國名),GSUB是最快的:

unlist(lapply(strsplit(as.character(data), "\\-"), function(x)x[length(x)])) 
#[1] "us" "es" "us" 
gsub('.*-([^-]+)$', '\\1', data) 
#[1] "us" "es" "us" 
do.call(rbind, str_match_all(data, '.*-([^-]+)$'))[,2] 
#[1] "us" "es" "us" 

library(stringr) 
library(microbenchmark) 
check.identical <- function(values) { 
    all(sapply(values[-1], function(x) identical(values[[1]], x))) 
} 
microbenchmark(unlist(lapply(strsplit(as.character(data), "\\-"), function(x)x[length(x)])), 
        gsub('.*-([^-]+)$', '\\1', data), 
        do.call(rbind, str_match_all(data, '.*-([^-]+)$'))[,2], 
        check=check.identical) 

Unit: microseconds 
                      expr min  lq  mean median  uq  max neval cld 
unlist(lapply(strsplit(as.character(data), "\\\\-"), function(x) x[length(x)])) 15.396 16.4655 20.09603 18.3895 20.3145 87.670 100 b 
              gsub(".*-([^-]+)$", "\\\\1", data) 11.975 13.6850 15.31916 15.3960 16.6790 27.799 100 a 
         do.call(rbind, str_match_all(data, ".*-([^-]+)$"))[, 2] 35.923 37.6340 43.93346 39.7720 41.4830 149.679 100 c 
相關問題