R에서 일정한 행 합계를 사용하여 임의 행렬 만들기
Jesse John
2023년6월21일
이 기사에서는 합계가 모든 행에 대해 일정하도록 각 행에서 임의로 선택된 음수가 아닌 값으로 행렬을 만드는 방법을 살펴봅니다.
간단하게 하기 위해 모든 행의 합이 1인 경우를 가정합니다. 행 벡터에 임의의 숫자를 곱하여 해당 숫자를 행 합계로 얻을 수 있습니다.
R에서 일정한 행 합계를 사용하여 임의 행렬 만들기
각 행에 4개의 요소가 있다고 가정합니다. 1보다 큰 양의 정수가 될 수 있습니다.
백분위수를 나타내는 0에서 100까지의 범위에서 시작합니다. 무작위로 선택한 3개의 컷 포인트를 사용하여 이 범위를 4개 부분으로 나눕니다.
이를 위해 해당 범위에서 임의로 3개의 점을 선택했습니다. 간단히 하기 위해 3개의 개별 숫자를 선택합니다.
선택한 컷 포인트를 내림차순으로 정렬합니다. 범위를 잘라낼 백분위수입니다.
컷 포인트를 100으로 나누겠습니다. 이렇게 하면 컷 포인트가 0에서 1까지의 십진수로 표시됩니다.
다음과 같이 1의 4개 섹션을 얻습니다.
- 1에서 첫 번째(가장 큰) 컷 포인트를 빼서 첫 번째 요소를 얻습니다.
- 첫 번째 절단점에서 두 번째 절단점을 빼서 두 번째 요소를 얻습니다.
- 두 번째 절단점에서 세 번째(가장 작은) 절단점을 빼서 세 번째 요소를 얻습니다.
- 세 번째 절단점에서 0을 빼서 네 번째 요소를 얻습니다.
이 숫자는 하나의 행을 구성합니다. 합하면 1이 됩니다. 필요한 행 수만큼 이 과정을 반복해야 합니다.
매트릭스용 코드
이제 각 행의 합이 1인 5행 4열의 임의 행렬을 얻는 코드를 살펴보겠습니다.
예제 코드:
# The final matrix.
# It begins as an empty matrix. It has 4 columns in our example.
Mx = matrix(byrow= TRUE, ncol = 4, nrow = 0)
# The number of rows. 5 rows in our example.
# We will repeat the code as many times as the number of rows we need.
for(RowNum in 1:5) {
# Cut points. With 3 cuts, we will get 4 elements.
# Randomly choose 3 different integers from the sequence 0 to 100.
cuts = sample(0:100, 3, replace = FALSE)
# Sort the cut points in descending order.
cuts.sort = sort(cuts, decreasing = TRUE)
# Convert the sorted cut points to decimals from 0 to 1.
cuts.dec = cuts.sort/100
# An empty vector to hold the current row that we will build.
Elements = c()
# The starting point for each cut.
# The first cut starts at 1. Then resets this to its value.
ElementStart = 1
# Create each element.
for(Cut in cuts.dec){
Elements = c(Elements, (ElementStart-Cut))
ElementStart = Cut
}
# Append the last element to get the full row.
# This is from the last (smallest) cut value to 0.
# (This vector can be multiplied by any number to get that number as the row sum.)
Elements = c(Elements, cuts.dec[3])
# Add the row to the matrix.
Mx = rbind(Mx, Elements)
rownames(Mx) = NULL
}
# Print the matrix.
print(Mx)
# Check that all 5 rows sum to 1.
table(apply(Mx, 1, sum))
출력:
> # Print the matrix.
> print(Mx)
[,1] [,2] [,3] [,4]
[1,] 0.38 0.36 0.16 0.10
[2,] 0.41 0.15 0.03 0.41
[3,] 0.08 0.50 0.35 0.07
[4,] 0.17 0.15 0.06 0.62
[5,] 0.07 0.09 0.23 0.61
>
> # Check that all 5 rows sum to 1.
> table(apply(Mx, 1, sum))
1
5
작가: Jesse John