การรวมกันที่ไม่ซ้ำกันขององค์ประกอบทั้งหมดตั้งแต่เวกเตอร์สอง (หรือมากกว่า)


97

ฉันพยายามสร้างชุดค่าผสมที่เป็นเอกลักษณ์ขององค์ประกอบทั้งหมดจากเวกเตอร์สองตัวที่มีขนาดต่างกันใน R

ตัวอย่างเช่นเวกเตอร์แรกคือ

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

และวันที่สองคือวันที่ที่จัดเก็บเป็นสตริงในปัจจุบัน

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

ฉันต้องการสร้าง data frame ที่มีสองคอลัมน์เช่นนี้

> 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

โดยพื้นฐานแล้วฉันกำลังมองหาชุดค่าผสมที่ไม่ซ้ำกันโดยพิจารณาองค์ประกอบทั้งหมดของเวกเตอร์หนึ่ง (a) ที่วางเคียงข้างกับองค์ประกอบทั้งหมดของเวกเตอร์ที่สอง (b)

ทางออกที่ดีจะทำให้เห็นภาพรวมของเวกเตอร์อินพุตมากขึ้น


ดูเพิ่มเติม:
วิธีสร้างเมทริกซ์ของชุดค่าผสม

คำตอบ:


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),];
thelatemail

มีคนที่มีตัวแทนมากกว่าฉันสามารถยอมรับคำตอบนี้ได้หรือไม่
Josh

หากคำสั่งและชื่อควรเป็นไปตามคำถาม:expand.grid(b=b,a=a)[2:1]
GKi

โปรดทราบว่าชื่อคือชุดค่าผสมที่ไม่ซ้ำกัน - คำตอบนี้ช่วยแก้ปัญหา OP ได้ แต่ถ้า 2 คอลัมน์เป็นประเภทข้อมูลเดียวกันและคุณใช้ expand.grid คุณจะมีการเรียงสับเปลี่ยนที่ไม่ซ้ำกันไม่ใช่ชุดค่าผสมที่ไม่ซ้ำกัน
เบรนต์

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():

แตกต่างกันไปองค์ประกอบแรกที่เร็วที่สุด อย่าแปลงสตริงเป็นปัจจัย ไม่เพิ่มแอตทริบิวต์เพิ่มเติมใด ๆ ส่งคืน tibble ไม่ใช่ data frame สามารถขยายเวกเตอร์ทั่วไปรวมทั้งเฟรมข้อมูล

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.