如何从每个不同长度的列表元素中获取特殊部分

时间:2017-01-05 03:11:54

标签: r list

数据格式如下: “性别Bornyear名国” 所以,数据列为:

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

我尝试使用

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

但是有些名称只拆分为一部分,有些则拆分为两部分或三部分。 如果我只是想与国家相关

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

这是最好的方法吗? 如果我想把这个名字拿出去怎么样?

1 个答案:

答案 0 :(得分: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