두 개 이상의 벡터에서 모든 요소의 고유 한 조합


96

R에서 크기가 다른 두 벡터의 모든 요소의 고유 한 조합을 만들려고합니다.

예를 들어, 첫 번째 벡터는

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

그래서 기본적으로 한 벡터 (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

제목은 Unique Combinations입니다.이 답변은 OP 문제를 해결합니다. 그러나 두 열이 동일한 데이터 유형이고 expand.grid를 적용하면 고유 한 조합이 아닌 고유 한 순열을 갖게됩니다
Brent

28

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결과 열의 이름이 자동으로 지정됩니다 ( herehere 참조 ).


4

버전 1.0.0부터는 tidyr자체 버전의 expand.grid(). 그것은 기존의 가족을 완료 expand(), nesting()crossing()낮은 수준의 기능을 가진 벡터로 작동하는지 .

비교 base::expand.grid():

첫 번째 요소를 가장 빠르게 변경합니다. 문자열을 인수로 변환하지 않습니다. 추가 속성을 추가하지 않습니다. 데이터 프레임이 아닌 tibble을 반환합니다. 데이터 프레임을 포함하여 모든 일반화 된 벡터를 확장 할 수 있습니다.

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.