R에서 벡터의 조합 및 순열 만들기
Base R은 이항 계수를 계산하고 순열의 수를 찾는 데 도움이 되는 함수를 제공합니다. 그러나 때때로 우리는 단지 숫자를 얻는 것이 아니라 모든 조합과 순열을 찾고 싶을 때가 있습니다.
이 기사에서는 조합 및 순열의 수를 구하는 방법과 모든 조합 및 순열을 구하는 방법에 대해 설명합니다. 또한 벡터에 중복 요소가 있을 때 어떤 일이 발생하는지에 대해서도 논의할 것입니다.
이러한 함수는 제한된 범위의 값에 대해서만 작동합니다.
이항 계수 및 조합
choose(n,k)
함수는 이항 계수를 계산합니다. 우리는 반복 없이 한 번에 k
를 취한 n
고유 항목의 조합 수를 얻습니다.
예제 코드:
# 조합
# 20개 개체에서 2개 개체의 조합 계산
선택(20,2)
# 매우 큰 값에는 작동하지 않습니다.
고르다(1030,500)
출력:
> # Count combinations of 2 objects from 20 objects.
> choose(20,2)
[1] 190
> # It does not work for very large values.
> choose(1030,500)
[1] Inf
계승 및 순열
factorial(x)
함수는 반복 없이 x
고유 개체의 순열 수를 제공합니다. n
개체 집합에서 k
개체의 순열을 계산하기 위한 기본 R에는 특정 함수가 없지만 factorial(n)
및 factorial(k)
의 몫으로 계산할 수 있습니다.
예제 코드:
# 순열
# 17개의 고유 개체의 순열
계승(17)
# 큰 값에는 작동하지 않습니다.
계승(171)
# 19개의 개별 개체에서 5개 개체의 순열
계승(19)/계승(5)
출력:
> # Permutations of 17 distinct objects.
> factorial(17)
[1] 3.556874e+14
> # It does not work for large values.
> factorial(171)
[1] Inf
> # Permutations of 5 objects from 19 distinct objects.
> factorial(19)/factorial(5)
[1] 1.013709e+15
하나의 벡터 요소 조합
함수 combn(x,m)
은 반복 없이 x
개별 개체에서 가져온 m
개체의 모든 조합을 나열합니다. 열은 서로 다른 조합입니다.
예제 코드:
# 객체 벡터
mv1 = c("테니스", "배드민턴", "축구", "육상", "체스")
mv1
# 두 요소의 모든 조합
빗(mv1,2)
# 세 가지 요소의 모든 조합
빗(mv1,3)
# 속성 확인
c3 = 빗(mv1,3)
등급(c3)
이름(c3)
출력:
> mv1
[1] "Tennis" "Badminton" "Football" "Athletics" "Chess"
> # All combinations of two elements.
> combn(mv1,2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] "Tennis" "Tennis" "Tennis" "Tennis" "Badminton" "Badminton" "Badminton" "Football" "Football"
[2,] "Badminton" "Football" "Athletics" "Chess" "Football" "Athletics" "Chess" "Athletics" "Chess"
[,10]
[1,] "Athletics"
[2,] "Chess"
> # Check its properties.
> c3 = combn(mv1,3)
> class(c3)
[1] "matrix" "array"
> names(c3)
NULL
출력은 배열입니다. 열 또는 행 이름이 없습니다.
많은 벡터 요소의 조합
expand.grid()
함수를 사용하면 주어진 벡터 요소의 모든 조합으로 데이터 프레임을 만들 수 있습니다. 이 함수는 여러 벡터를 입력으로 받을 수 있습니다.
다시 말하지만, 함수가 원하는 출력을 제공하려면 입력 벡터에 고유한 요소가 있어야 합니다.
예제 코드:
# 새로운 벡터 생성
mv2 = c("사과", "망고", "당근")
mv2
# expand.grid() 함수는 주어진 벡터 요소의 모든 조합을 나열합니다.
# 기존 벡터를 사용하거나 C()를 사용하여 벡터 생성
ex_df = expand.grid(스포츠 = mv1, 과일 = mv2, 색상 = c("파란색", "빨간색"))
ex_df
출력:
> mv2
[1] "Apple" "Mango" "Carrot"
> # The expand.grid() function lists all combinations of the elements of the given vectors.
> # Use existing vectors or create a vector using c().
> ex_df = expand.grid(Sport = mv1, Fruit = mv2, Color = c("Blue", "Red"))
> ex_df
Sport Fruit Color
1 Tennis Apple Blue
2 Badminton Apple Blue
3 Football Apple Blue
4 Athletics Apple Blue
5 Chess Apple Blue
6 Tennis Mango Blue
7 Badminton Mango Blue
8 Football Mango Blue
9 Athletics Mango Blue
10 Chess Mango Blue
11 Tennis Carrot Blue
12 Badminton Carrot Blue
13 Football Carrot Blue
14 Athletics Carrot Blue
15 Chess Carrot Blue
16 Tennis Apple Red
17 Badminton Apple Red
18 Football Apple Red
19 Athletics Apple Red
20 Chess Apple Red
21 Tennis Mango Red
22 Badminton Mango Red
23 Football Mango Red
24 Athletics Mango Red
25 Chess Mango Red
26 Tennis Carrot Red
27 Badminton Carrot Red
28 Football Carrot Red
29 Athletics Carrot Red
30 Chess Carrot Red
열이 벡터에 해당하고 행이 요소의 조합인 데이터 프레임을 얻습니다. 행 수는 각 벡터의 요소 수를 곱한 것입니다.
벡터 요소의 순열
combinat
패키지의 permn()
함수는 벡터의 모든 요소에 대한 순열을 생성합니다. 이 패키지를 설치해야 할 수도 있습니다.
예제 코드:
# Combinat 패키지를 사용할 수 없는 경우 설치
# 주석을 제거하고 다음 줄을 실행하여 설치
# install.packages("조합")
# Combinat 패키지 로드
라이브러리(조합)
# 벡터의 모든 순열 생성
파마(mv2)
출력:
> # Create all permutations of a vector.
> permn(mv2)
[[1]]
[1] "Apple" "Mango" "Carrot"
[[2]]
[1] "Apple" "Carrot" "Mango"
[[3]]
[1] "Carrot" "Apple" "Mango"
[[4]]
[1] "Carrot" "Mango" "Apple"
[[5]]
[1] "Mango" "Carrot" "Apple"
[[6]]
[1] "Mango" "Apple" "Carrot"
고유하지 않은 요소 다루기
벡터의 일부 요소가 동일하면 어떤 일이 발생하는지 봅시다. 세 함수의 출력을 모두 살펴보겠습니다.
예제 코드:
# Combn()의 예
# 일부 동일한 요소가 있는 벡터
mv3 = c("테니스", "테니스", "축구", "운동")
mv3
# 결과 조합
c2 = 빗(mv3,2)
c2
# expand.grid()의 예
mv4 = c("빨강", "파랑", "빨강")
예 = expand.grid(스포츠 = mv3, 색상 = mv4)
예를 들어
# Permn()의 예
pn = 영구(mv4)
pn
출력:
# Example for combn().
> mv3
[1] "Tennis" "Tennis" "Football" "Athletics"
> # Resulting combinations.
> c2 = combn(mv3,2)
> c2
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "Tennis" "Tennis" "Tennis" "Tennis" "Tennis" "Football"
[2,] "Tennis" "Football" "Athletics" "Football" "Athletics" "Athletics"
> # Example for expand.grid().
> mv4 = c("Red", "Blue", "Red")
> eg = expand.grid(Sport = mv3, Color = mv4)
> eg
Sport Color
1 Tennis Red
2 Tennis Red
3 Football Red
4 Athletics Red
5 Tennis Blue
6 Tennis Blue
7 Football Blue
8 Athletics Blue
9 Tennis Red
10 Tennis Red
11 Football Red
12 Athletics Red
> # Example for permn().
> pn = permn(mv4)
> pn
[[1]]
[1] "Red" "Blue" "Red"
[[2]]
[1] "Red" "Red" "Blue"
[[3]]
[1] "Red" "Red" "Blue"
[[4]]
[1] "Red" "Blue" "Red"
[[5]]
[1] "Blue" "Red" "Red"
[[6]]
[1] "Blue" "Red" "Red"
combn()
출력에서 동일한 요소가 다른 요소와 결합됩니다. expand.grid()
의 출력에는 동일한 행이 있고 permn()
출력의 각 행에 동일한 요소가 나타나며 일부 행도 동일합니다.
이것이 원하는 출력이 아닌 경우 추가 데이터 처리가 필요합니다. 일반적으로 가장 쉬운 옵션은 사용하는 벡터에 고유한 요소가 있는지 확인하는 것이며 이를 위해 unique()
함수를 사용할 수 있습니다.
예제 코드:
# 중복 제거 후 출력
# 빗()
c2_u = 빗(고유(mv3),2)
c2_u
# 확장.그리드()
eg_u = expand.grid(스포츠 = 고유(mv3), 색상 = 고유(mv4))
eg_u
# 파마()
pn_u = permn(고유(mv4))
pn_u
출력:
> # combn()
> c2_u = combn(unique(mv3),2)
> c2_u
[,1] [,2] [,3]
[1,] "Tennis" "Tennis" "Football"
[2,] "Football" "Athletics" "Athletics"
> # expand.grid()
> eg_u = expand.grid(Sport = unique(mv3), Color = unique(mv4))
> eg_u
Sport Color
1 Tennis Red
2 Football Red
3 Athletics Red
4 Tennis Blue
5 Football Blue
6 Athletics Blue
> # permn()
> pn_u = permn(unique(mv4))
> pn_u
[[1]]
[1] "Red" "Blue"
[[2]]
[1] "Blue" "Red"
결론
분석이나 일러스트레이션을 위해 데이터를 생성해야 할 때 벡터 또는 여러 벡터에서 생각할 수 있는 모든 요소 조합을 생성하는 기능이 유용합니다.
이 기사에서 우리는 R에서 벡터의 조합과 순열을 생성하고 이러한 조합과 순열의 수를 계산하는 것이 얼마나 쉬운지 살펴보았습니다.
또한 벡터에서 동일한 요소의 효과를 살펴보고 문제를 처리하는 한 가지 방법을 확인했습니다.