, @ thela önerisi varyasyonu olan: Zaten
paste0
birlikte bir vektör
collapse = TRUE
"bağlamak" için sıralı unsur gerekiyor anladım
Alternatif olarak, bir paket kullanmayı düşünmüyorsanız, @Jota tarafından önerilen "stringi" paketine, özellikle stri_flatten
'a bakın.
l <- list(list("A"), list("B"), list("B"), list("B"), list("B"),
list("C","D"), list("E","F", "G", "H"),
as.list(rep(letters,10)), as.list(rep(letters,2)))
l <- unlist(replicate(1000, l, FALSE), recursive = FALSE)
funop <- function() sapply(l,function(x) paste(unlist(x),collapse=""))
fun42 <- function() sapply(l, paste0, collapse="")
funv <- function() vapply(l, paste0, character(1L), collapse = "")
funam <- function() {
x <- lengths(l)
l[x > 1] <- lapply(l[x > 1], paste0, collapse = "")
unlist(l, use.names = FALSE)
}
funj <- function() sapply(l, stri_flatten)
funamj <- function() {
x <- lengths(l)
l[x > 1] <- lapply(l[x > 1], stri_flatten)
unlist(l, use.names = FALSE)
}
library(microbenchmark)
microbenchmark(funop(), fun42(), funv(), funam(), funj(), times = 20)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# funop() 78.21822 84.79588 85.30055 85.36399 86.90540 90.48321 20 e
# fun42() 56.16938 57.35735 61.60008 58.04969 65.82836 81.46482 20 d
# funv() 54.64101 56.23245 60.07896 57.26049 63.96815 78.58043 20 d
# funam() 45.89760 46.89890 48.99810 47.29617 48.28764 56.92544 20 c
# funj() 28.73405 29.94041 32.00676 30.56711 31.11448 39.93765 20 b
# funamj() 18.64829 19.01328 21.05989 19.12468 19.52516 32.87569 20 a
Not:
İşte performans karşılaştırması var bu yaklaşımın nispi verimliliği birçok liste öğeleri length(x) > 1
yaşayacaksın nasıl bağlı olacaktır. Eğer birçoğu zaten > 1
olacaksa, o zaman 42'lerin yaklaşımı ile devam edin. stri_flatten
sadece, yukarıdaki kıyaslama için kullanılan örnek listesinde olduğu gibi birlikte yapıştırılacak uzun karakter vektörleriniz varsa, performansı artırır, aksi takdirde yardımcı olmaz.
'vapply'? Bu durumda "sapply" yavaş mı? – A5C1D2H2I1M1N2O1R2T1
Sadece "yapıştır" ı "l" uzunluğu olan "1", sonra "liste dışı" bölümlerine uygulayın. Ve Ananda'nın “vapply” ile değiştirilmesi, Ananda'nın biraz daha hızlı bir şekilde dışarı fırlatılmasını önerdiği gibi. – thelatemail