Sự kết hợp duy nhất của tất cả các phần tử từ hai (hoặc nhiều) vectơ


95

Tôi đang cố gắng tạo sự kết hợp duy nhất của tất cả các phần tử từ hai vectơ có kích thước khác nhau trong R.

Ví dụ: vectơ đầu tiên là

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

và thứ hai là ngày được lưu trữ dưới dạng chuỗi hiện tại

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

Tôi cần tạo một khung dữ liệu có hai cột như thế này

> 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

Vì vậy, về cơ bản, tôi đang tìm kiếm một sự kết hợp duy nhất bằng cách xem xét tất cả các phần tử của một vectơ (a) đặt cạnh nhau với tất cả các phần tử của vectơ thứ hai (b).

Một giải pháp lý tưởng sẽ tổng quát hóa cho nhiều vectơ đầu vào hơn.


Xem thêm:
Cách tạo ma trận kết hợp

Câu trả lời:


139

đây có thể là điều bạn đang theo đuổi

> 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

Nếu thứ tự kết quả không như bạn muốn, bạn có thể sắp xếp sau đó. Nếu bạn đặt tên cho các đối số expand.grid, chúng sẽ trở thành tên cột:

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

expand.gridtổng quát hóa cho bất kỳ số lượng cột đầu vào nào.


4
Và không cần plyrphải chỉ làm một sắp xếp:result <- expand.grid(a=a,b=b); result <- result[order(result$a,result$b),];
thelatemail

Liệu ai đó có nhiều đại diện hơn tôi có thể chấp nhận câu trả lời này không?
Josh

Nếu thứ tự và tên phải như trong câu hỏi:expand.grid(b=b,a=a)[2:1]
GKi

Lưu ý tiêu đề là Kết hợp duy nhất - câu trả lời này giải quyết vấn đề OP, nhưng nếu 2 cột có cùng kiểu dữ liệu và bạn áp dụng expand.grid, bạn sẽ có các hoán vị duy nhất, không phải kết hợp duy nhất
Brent

27

Các tidyrgói cung cấp các lựa chọn tốt đẹp crossing, hoạt động tốt hơn so với cổ điển expand.gridchức năng bởi vì (1) dây không được chuyển đổi thành các yếu tố và (2) sự phân loại là trực quan hơn:

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

Thiếu trong này tổng quan là CJchức năng từ-gói. Sử dụng:

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

cho:

      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

LƯU Ý: vì phiên bản 1.12.2 tự động CJđặt tên cho các cột kết quả (xem thêm tại đâytại đây ).


4

Kể từ phiên bản 1.0.0, tidyrcung cấp phiên bản riêng của expand.grid(). Nó hoàn thành gia đình hiện có của expand(), nesting()crossing()với một chức năng cấp thấp mà công trình với vectơ .

Khi so sánh với base::expand.grid():

Thay đổi phần tử đầu tiên nhanh nhất. Không bao giờ chuyển đổi chuỗi thành thừa số. Không thêm bất kỳ thuộc tính bổ sung nào. Trả về một nhỏ, không phải một khung dữ liệu. Có thể mở rộng bất kỳ vectơ tổng quát nào, bao gồm cả khung dữ liệu.

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

bạn có thể sử dụng hàm thứ tự để sắp xếp bất kỳ số lượng cột nào. cho ví dụ của bạn

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`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.