OP 注意到数据框的大小。因此,对提出的三种方法进行基准测试似乎是值得的:
library(microbenchmark)
df <-
tibble(
A = 1:100000,
B = paste0(sample(LETTERS,100000,replace=T),sample(LETTERS,100000,replace=T))
)
microbenchmark(
tidyr = df %>%
separate(B, into = c('C', 'D'), sep= 1, remove = FALSE),
strsplit = cbind(df,`names<-`(data.frame(do.call(rbind,strsplit(df$B,""))),c("C","D"))),
substr = cbind(df, 'C' = substr(df$B, 1, 1), 'D' = substr(df$B, nchar(df$B), nchar(df$B)))
)
使用separate() 的tidyr 解决方案明显更快:
Unit: milliseconds
expr min lq mean median uq max neval
tidyr 10.9737 11.99655 13.59860 13.32865 13.98510 28.6455 100
strsplit 39.4084 42.33310 47.20898 46.13145 51.55815 67.0940 100
substr 42.3147 47.90830 54.42131 51.05375 55.79760 184.6317 100
尽管弦长时增益会有所降低。例如,添加第三个字符并调整上述内容:
Unit: milliseconds
expr min lq mean median uq max neval
tidyr 17.6609 19.7422 24.06847 21.75830 22.93855 54.1001 100
strsplit 43.7746 58.0660 69.91389 64.69815 72.97280 199.4662 100
substr 50.8109 56.5016 65.98295 59.53490 65.45865 154.3368 100