不幸的是,尾矿相对缓慢。 最终项目的指数实际上要快得多。
FUN <- function(x) {ss <- strsplit(x, )[[1]];ss[length(ss)]}
在我的机器上,这远远快于尾部的两倍。
y <- c("AAAAAAAAAAA 250.00",
"01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 5.13",
"01 JUN 2003 02 JUN 2002 OCTOPUS CARDS LTD HONG KONG HK 834591283405347 50.00")
#make y bigger so that there s something to test
y <- rep(y, 1e5)
#testing tail
FUN <- function(x) {tail(strsplit(x, )[[1]],1)}
system.time( lapply(y,FUN) )
user system elapsed
22.108 0.110 22.069
#testing indexing
FUN <- function(x) {ss <- strsplit(x, )[[1]];ss[length(ss)]}
system.time( lapply(y,FUN) )
user system elapsed
9.396 0.037 9.372
但是,通过将功能分离和利用组成部分已经成为病媒这一事实,实现更快。 (整个适用的家庭指挥点不是要取代住所,而是允许简单的yn子并尽可能使用病媒控制。) 尽可能最简单的职能应该如实。
#first let strsplit do it s own vectory magic
s <- strsplit(y, )
#then define a simpler function
FUN <- function(x) x[length(x)]
lapply(s, FUN)
要及时测试,就必须在例行时间内保持分机,使之公平。
system.time( {s <- strsplit(y, );lapply(s, FUN)} )
user system elapsed
5.281 0.048 5.305
(我确信,在指数化名单上没有东西,我的职能应当更加简单)
更有一点,这本来会把事情推向前进,但我在此补充。 斜体有固定的选择。 如果你用定期的表述来确定这一点,就会更快地开展工作。
system.time( {s <- strsplit(y, , fixed = TRUE); lapply(s, FUN)} )
user system elapsed
1.256 0.007 1.253
如果你在大型数据集上重新这样做,或者你不得不经常在中等规模的数据集上这样做,那么你实际上应该采用最后的方法。 速度将近20倍。
这里最后的解决办法是,根据Edit第3号的预期,Y是特征的载体,然后才能完成整个任务。 预计最后一个项目是储蓄的货币价值,第二个项目是某种身份识别价值。
s <- strsplit(y, , fixed = TRUE)
moneyVal <- lapply(s, function(x) x[length(x)])
idVal <- lapply(s, function(x) x[length(x)-1])
restOfY <- lapply(s, function(x) paste(x[1:(length(x)-2)], collapse = ))
#These three values can be combined into a data frame
df <- data.frame(restOfY, idVal, moneyVal)