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)의 모든 요소와 나란히 배치하여 고유 한 조합을 찾고 있습니다.
이상적인 솔루션은 더 많은 입력 벡터로 일반화하는 것입니다.
참조 :
조합 행렬 생성 방법
답변
이것은 아마도 당신이 추구하는 것입니다
> 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
임의의 수의 입력 열로 일반화합니다.
답변
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
답변
이것에 누락 r-faq개요는 것입니다 CJ
로부터 α- 함수data.table-꾸러미. 사용 :
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.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
답변
주문 기능을 사용하여 원하는 수의 열을 정렬 할 수 있습니다. 당신의 예를 들어
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`