দুটি (বা আরও) ভেক্টর থেকে সমস্ত উপাদানগুলির অনন্য সংমিশ্রণ


97

আমি আর এর বিভিন্ন আকারের দুটি ভেক্টর থেকে সমস্ত উপাদানগুলির একটি অনন্য সংমিশ্রণ তৈরি করার চেষ্টা করছি।

উদাহরণস্বরূপ, প্রথম ভেক্টর হ'ল

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

সুতরাং মূলত, আমি একটি ভেক্টরের সমস্ত উপাদান বিবেচনা করে একটি অনন্য সংমিশ্রণের সন্ধান করছি (ক) দ্বিতীয় ভেক্টরের (বি) সমস্ত উপাদানগুলির সাথে জুস্টপোজ করা।

একটি আদর্শ সমাধান আরও ইনপুট ভেক্টরগুলিতে সাধারণীকরণ করবে।


আরও দেখুন:
সংমিশ্রণের একটি ম্যাট্রিক্স কীভাবে উত্পন্ন করা যায়

উত্তর:


141

এটি সম্ভবত আপনি কি পরে

> 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),];
থেটমেল

আমার চেয়ে বেশি পরিচিত কেউ কি এই উত্তরটি মেনে নিতে সক্ষম?
জোশ

অর্ডার এবং নামগুলি যদি প্রশ্নের মতো হয়:expand.grid(b=b,a=a)[2:1]
GKi

শিরোনামটি অনন্য সংমিশ্রণগুলি মনে রাখবেন - এই উত্তরটি ওপি সমস্যা সমাধান করে, তবে যদি 2 টি কলাম একই ডেটা ধরণের হয় এবং আপনি প্রসারণ.গ্রিড প্রয়োগ করেন তবে আপনার অনন্য সংযোজন হবে না, অনন্য সংমিশ্রণ হবে না
ব্রেন্ট

29

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ফাংশন থেকে-প্যাকেজ ব্যবহার:

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

দ্রষ্টব্য: যেহেতু সংস্করণ 1.12.2 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`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.