2016-01-06 20 views
11

के लिए सूचियों की एक सूची में कनवर्ट करें मैं पात्रों की सूची की एक सूची है। उदाहरण के लिए:एक चरित्र वेक्टर

l <- list(list("A"),list("B"),list("C","D")) 

तो जैसा कि आप कुछ तत्वों लंबाई की सूची देख सकते हैं> 1.

मैं एक चरित्र वेक्टर के लिए सूचियों की इस सूची में कनवर्ट करना चाहते हैं, लेकिन मैं लंबाई के साथ सूची चाहते हैं > 1 चरित्र वेक्टर में एक तत्व के रूप में दिखाई देने के लिए।

unlist समारोह है कि लक्ष्य को हासिल नहीं है, बल्कि:

"A" "B" "CD" 
+3

'vapply'? इस मामले में 'धीमा' धीमा है? – A5C1D2H2I1M1N2O1R2T1

+4

केवल 'l'' के हिस्सों में 'पेस्ट' लागू करें जो 'लंबाई> 1', फिर' असूची 'है? और 'vapply' के साथ' sapply' को प्रतिस्थापित करें क्योंकि आनंद थोड़ा और अधिक गति से बाहर निकलने का सुझाव देता है। – thelatemail

उत्तर

16

आप को छोड़ कर सकते हैं:

sapply(l,function(x) paste(unlist(x),collapse="")) 

मेरी वांछित परिणाम प्राप्त करने के लिए:

> unlist(l) 
[1] "A" "B" "C" "D" 

वहाँ तेजी से कुछ भी है असूचीबद्ध कदम। आप पहले से ही पता लगा कि paste0 जरूरत collapse = TRUE करने के लिए "बाँध" अनुक्रमिक एक वेक्टर के तत्वों को एक साथ:

> sapply(l, paste0, collapse="") 
[1] "A" "B" "CD" 
6

यहाँ, @ Thela के सुझाव का एक परिवर्तन हो अगर आप एक बहु लाइन दृष्टिकोण कोई आपत्ति नहीं है:

x <- lengths(l)          ## Get the lengths of each list 
l[x > 1] <- lapply(l[x > 1], paste0, collapse = "") ## Paste only those together 
unlist(l, use.names = FALSE)      ## Unlist the result 
# [1] "A" "B" "CD" 

वैकल्पिक रूप से, अगर आप एक पैकेज का उपयोग कोई आपत्ति नहीं है, "stringi" पैकेज में, विशेष रूप से stri_flatten, देखने के रूप में @Jota ने सुझाव दिया।

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 

नोट::


यहाँ एक प्रदर्शन की तुलना है इस दृष्टिकोण का सापेक्ष दक्षता कितने सूची आइटम length(x) > 1 के लिए जा रहे हैं पर निर्भर करेगा। यदि उनमें से अधिकतर > 1 होने जा रहे हैं, तो बस @ 42-के दृष्टिकोण के साथ जाएं। stri_flatten केवल प्रदर्शन में सुधार करता है यदि आपके पास ऊपर वर्णित बेंचमार्क के लिए उपयोग की गई नमूना सूची में एक साथ पेस्ट करने के लिए लंबे चरित्र वैक्टर हैं, अन्यथा, यह मदद नहीं करता है।

+0

यह लिखने के लिए धन्यवाद - मैं इस पल :-) – thelatemail

+0

@Jota पर मेरे सामने आर की जरूरत नहीं है, विकल्प और CWD जवाब गयी। कृपया अन्य विकल्पों में संपादित करने और जोड़ने के लिए स्वतंत्र महसूस करें। – A5C1D2H2I1M1N2O1R2T1

संबंधित मुद्दे