一些基準測試結果(所有的三個選項提取與提供的樣本數據中的國名),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
這當然不是一個「壞」的方式 - 這幾乎是我怎麼樣除了錯字'charactoe'和使用'tail,1'而不是'x [length(x)]'函數之外,請執行此操作。如果您有關於哪些部分與哪些字段相對應的規則,那麼您應該能夠調整代碼,以便按照您已經想出的方式採用前1或2次拆分,中間拆分集或最後一次拆分。 – thelatemail
如果它總是一個兩字符的代碼,你可以在'nchar'中使用'substr',但它的複雜性大致相同。 – alistaire
你也可以使用正則表達式:'sub('。*? - ([^ - ] + $)','\\ 1','M-1900-Aboul-Enein-us')'給出'us'。 – mt1022