2013-04-22 10 views
40

मैं दो वैक्टर है:चिपकाया जा रहा है दो वैक्टर

vars <- c("SR", "PL") 
vis <- c(1,2,3) 

इन वैक्टर मैं निम्नलिखित वेक्टर बनाना चाहेंगे के आधार पर:

"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

paste के साथ मेरे पास है निम्नलिखित परिणाम:

paste(vars, vis, sep=".") 
[1] "SR.1" "PL.2" "SR.3" 

मैं जिस सदिश की आवश्यकता है उसे मैं कैसे बना सकता हूं?

उत्तर

47

आप इस का उपयोग कर सकते हैं, लेकिन वहाँ एक सरल समाधान हो सकता है:

R> apply(expand.grid(vars, vis), 1, paste, collapse=".") 
[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 

expand.grid एक data.frame वापस देता है जो जब apply के साथ प्रयोग किया, apply यह एक matrix में बदल जाएगा। यह सिर्फ अनावश्यक है (और बड़े डेटा पर अक्षम है)। outermatrix देता है और फ़ंक्शन तर्क भी लेता है। यह विशाल डेटा पर भी बहुत कुशल होगा।

outer का उपयोग करना:

as.vector(outer(vars, vis, paste, sep=".")) 
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 
6

, आप दोनों विधियों के इन दो संशोधनों का उपयोग कर सकते प्रश्न में अनुरोध तार की व्यवस्था बनाए रखने के लिए:

वैक्टर के आदेश परिवर्तन और उलटे क्रम

में गठबंधन
apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

या सदिश करने के लिए परिवर्तित करने से पहले मैट्रिक्स स्थानांतरित:

as.vector(t(outer(vars, vis, paste, sep="."))) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 
4

expand.grid के साथ संयोजन में sprintf का उपयोग कर एक अन्य विकल्प: जो देता है

eg <- expand.grid(vis, vars) 
sprintf('%s.%s', eg[,2], eg[,1]) 

:

[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

स्पष्टीकरण:

  • expand.grid के साथ आप दो वैक्टर के सभी संयोजनों पैदा करते हैं।
  • sprintf निर्दिष्ट प्रारूप ('%s.%s') के अनुसार दोनों वैक्टरों को एक साथ चिपकाता है। प्रारूप के प्रत्येक %s भाग को वैक्टर के तत्वों द्वारा प्रतिस्थापित किया जाता है।
+1

मैं लगता है कि यह सभी सुझावों का सबसे सुंदर समाधान है! –

5

इस पुराने प्रश्न का पहले से ही एक स्वीकार्य उत्तर है।लेकिन के रूप में यह शिकार लक्ष्य के रूप में इस्तेमाल किया जा रहा है, मेरा मानना ​​है कि यह एक data.table समाधान जो का उपयोग करता है पार समारोह CJ() में शामिल होने को जोड़ने के लिए फ़ायदेमंद हो सकता है:

library(data.table) 
CJ(vars, vis)[, paste(V1, V2, sep =".")] 
#[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3" 

मामले में मूल आदेश महत्वपूर्ण है:

CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] 
#[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 
संबंधित मुद्दे