दो (या अधिक) वैक्टर से सभी तत्वों का अनूठा संयोजन


95

मैं आर में अलग-अलग आकार के दो वैक्टर से सभी तत्वों का एक अनूठा संयोजन बनाने की कोशिश कर रहा हूं।

उदाहरण के लिए, पहला वेक्टर है

a <- c("ABC", "DEF", "GHI")

और दूसरा वर्तमान में तार के रूप में संग्रहीत तिथियाँ हैं

b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

मुझे इस तरह दो कॉलम के साथ एक डेटा फ्रेम बनाने की आवश्यकता है

> data
    a          b
1  ABC 2012-05-01
2  ABC 2012-05-02
3  ABC 2012-05-03
4  ABC 2012-05-04
5  ABC 2012-05-05
6  DEF 2012-05-01
7  DEF 2012-05-02
8  DEF 2012-05-03
9  DEF 2012-05-04
10 DEF 2012-05-05
11 GHI 2012-05-01
12 GHI 2012-05-02
13 GHI 2012-05-03
14 GHI 2012-05-04
15 GHI 2012-05-05

इसलिए मूल रूप से, मैं एक वेक्टर (ए) के सभी तत्वों को दूसरे वेक्टर (बी) के सभी तत्वों के साथ मिलाकर एक अद्वितीय संयोजन की तलाश कर रहा हूं।

एक आदर्श समाधान अधिक इनपुट वैक्टर को सामान्य करेगा।


यह भी देखें:
संयोजन का एक मैट्रिक्स कैसे उत्पन्न करें

जवाबों:


139

शायद यह आप के बाद क्या है

> expand.grid(a,b)
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

यदि परिणामी आदेश वह नहीं है जो आप चाहते हैं, तो आप बाद में छाँट सकते हैं। यदि आप तर्कों को नाम देते हैं expand.grid, तो वे स्तंभ नाम बन जाएंगे:

df = expand.grid(a = a, b = b)
df[order(df$a), ]

और expand.gridकिसी भी संख्या में इनपुट कॉलम को सामान्य करता है।


4
और बिना plyrकिसी प्रकार की आवश्यकता के:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
Thelatemail

क्या मेरे साथ कोई और प्रतिनिधि है जो इस उत्तर को स्वीकार कर सकता है?
जोश

यदि आदेश और नाम प्रश्न में होने चाहिए:expand.grid(b=b,a=a)[2:1]
GKi

नोट शीर्षक अद्वितीय संयोजन है - यह उत्तर ओपी समस्या को हल करता है, लेकिन यदि 2 कॉलम एक ही डेटा प्रकार के हैं और आप विस्तार लागू करते हैं। इसके अलावा, आपके पास अद्वितीय क्रमपरिवर्तन होंगे, न कि अद्वितीय संयोजन
ब्रेंट

27

tidyrपैकेज अच्छा विकल्प प्रदान करता है crossing, जो क्लासिक की तुलना में बेहतर काम करता है expand.gridसमारोह क्योंकि (1) तार कारकों में परिवर्तित नहीं कर रहे हैं और (2) छंटाई अधिक सहज ज्ञान युक्त है:

library(tidyr)

a <- c("ABC", "DEF", "GHI")
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

crossing(a, b)

# A tibble: 15 x 2
       a          b
   <chr>      <chr>
 1   ABC 2012-05-01
 2   ABC 2012-05-02
 3   ABC 2012-05-03
 4   ABC 2012-05-04
 5   ABC 2012-05-05
 6   DEF 2012-05-01
 7   DEF 2012-05-02
 8   DEF 2012-05-03
 9   DEF 2012-05-04
10   DEF 2012-05-05
11   GHI 2012-05-01
12   GHI 2012-05-02
13   GHI 2012-05-03
14   GHI 2012-05-04
15   GHI 2012-05-05

13

इसमें मिसिंग है अवलोकन से CJ-function है-package। का उपयोग करते हुए:

library(data.table)
CJ(a, b, unique = TRUE)

देता है:

      a          b
 1: ABC 2012-05-01
 2: ABC 2012-05-02
 3: ABC 2012-05-03
 4: ABC 2012-05-04
 5: ABC 2012-05-05
 6: DEF 2012-05-01
 7: DEF 2012-05-02
 8: DEF 2012-05-03
 9: DEF 2012-05-04
10: DEF 2012-05-05
11: GHI 2012-05-01
12: GHI 2012-05-02
13: GHI 2012-05-03
14: GHI 2012-05-04
15: GHI 2012-05-05

नोट: संस्करण १.१२.२ के बाद से CJपरिणाम कॉलम ( यहां और यहां भी देखें ) को स्वतः नाम दें ।


4

संस्करण 1.0.0 के बाद से, tidyrइसका अपना संस्करण प्रदान करता है expand.grid()। यह की मौजूदा परिवार पूरा करता है expand(), nesting()और crossing()एक निम्न स्तर के समारोह के साथ कि वैक्टर के साथ काम करता है

जब तुलना करने के लिए base::expand.grid():

सबसे पहला तत्व तेजी से बदलता है। कभी भी स्ट्रिंग को कारकों में नहीं बदलता है। कोई अतिरिक्त गुण नहीं जोड़ता है। डेटा फ्रेम नहीं, एक टिबबल लौटाता है। डेटा फ़्रेम सहित किसी भी सामान्यीकृत वेक्टर का विस्तार कर सकते हैं।

a <- c("ABC", "DEF", "GHI")
b <- c("2012-05-01", "2012-05-02", "2012-05-03", "2012-05-04", "2012-05-05")

tidyr::expand_grid(a, b)

   a     b         
   <chr> <chr>     
 1 ABC   2012-05-01
 2 ABC   2012-05-02
 3 ABC   2012-05-03
 4 ABC   2012-05-04
 5 ABC   2012-05-05
 6 DEF   2012-05-01
 7 DEF   2012-05-02
 8 DEF   2012-05-03
 9 DEF   2012-05-04
10 DEF   2012-05-05
11 GHI   2012-05-01
12 GHI   2012-05-02
13 GHI   2012-05-03
14 GHI   2012-05-04
15 GHI   2012-05-05

3

आप किसी भी संख्या के कॉलम को सॉर्ट करने के लिए ऑर्डर फंक्शन का उपयोग कर सकते हैं। अपने उदाहरण के लिए

df <- expand.grid(a,b)
> df
   Var1       Var2
1   ABC 2012-05-01
2   DEF 2012-05-01
3   GHI 2012-05-01
4   ABC 2012-05-02
5   DEF 2012-05-02
6   GHI 2012-05-02
7   ABC 2012-05-03
8   DEF 2012-05-03
9   GHI 2012-05-03
10  ABC 2012-05-04
11  DEF 2012-05-04
12  GHI 2012-05-04
13  ABC 2012-05-05
14  DEF 2012-05-05
15  GHI 2012-05-05

> df[order( df[,1], df[,2] ),] 
   Var1       Var2
1   ABC 2012-05-01
4   ABC 2012-05-02
7   ABC 2012-05-03
10  ABC 2012-05-04
13  ABC 2012-05-05
2   DEF 2012-05-01
5   DEF 2012-05-02
8   DEF 2012-05-03
11  DEF 2012-05-04
14  DEF 2012-05-05
3   GHI 2012-05-01
6   GHI 2012-05-02
9   GHI 2012-05-03
12  GHI 2012-05-04
15  GHI 2012-05-05`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.