无论你有一个或多个项目的列表,我可能会这样做:
无论您的列表只有一个项目还是多个项目,我都会进行类似的操作:
str_split(gsub("^,|,$|\\s+", "", v), ",")
或者更好的方法是:
strsplit(gsub("^,|,$|\\s+", "", v), ",", TRUE)
(或者,根据您实际的数据,甚至可以使用strsplit(gsub("^,|,$|\\s", "", gsub(", ,", ",", v, fixed = TRUE)), ",", TRUE)
。)
以下是一个示例,其中包含多个元素的list
,而不是只有一个元素的list
。
v <- rep(v, 2500)
我已经将其他答案放入函数中,并根据需要进行修改,使它们适用于多个list
元素。以下是我测试过的函数:
fun_a5a <- function() str_split(gsub("^,|,$|\\s+", "", v), ",")
fun_a5b <- function() strsplit(gsub("^,|,$|\\s+", "", v), ",", TRUE)
fun_ak <- function() lapply(str_split(v, pattern = ",\\s*"), setdiff, "")
fun_des <- function() {
v2 <- lapply(str_split(v, pattern = ","), trimws)
lapply(v2, function(x) x[x != ""])
}
fun_hfa <- function() Map(function(x){trimws(unlist(strsplit(x, ",")))}, v)
fun_hfb <- function() sapply(v, strsplit, ",\\s*")
fun_jay <- function() lapply(unlist(lapply(v, strsplit, ","), recursive = FALSE), trimws)
fun_tica <- function() lapply(str_split(v, pattern = ",\\s?"), Filter, f = nchar)
fun_ticb <- function() lapply(str_split(v, pattern = ",\\s?"), Filter, f = nzchar)
以下是结果:
bench::mark(fun_a5a(), fun_a5b(),
fun_ak(),
fun_des(),
fun_hfa(), fun_hfb(),
fun_jay(),
fun_tica(), fun_ticb())
ggplot::autoplot(.Last.value)
![enter image description here](https://istack.dev59.com/v67Sb.webp)
[]
。但在这种情况下,我并不真正了解它的位置? - AnilGoyalstrsplit
为什么有效是他回答中的重要教训(并且在?strsplit
中有记录)。 - A5C1D2H2I1M1N2O1R2T1