'스위프' 기능 사용 방법
R 패키지의 소스를 보면 기능이 보입니다.sweep꽤 자주 사용됩니다.때때로 더 간단한 기능으로 충분할 때 사용됩니다(예:apply), 다른 경우에는 코드 블록을 통과하는 데 상당한 시간을 들이지 않고는 정확히 무엇을 하고 있는지 알 수 없습니다.
내가 재현할 수 있다는 것은sweep더 간단한 기능을 사용한 의 효과는 내가 이해하지 못한다는 것을 시사합니다.sweep의 핵심 사용 사례, 그리고 이 기능이 매우 자주 사용된다는 사실은 이 기능이 상당히 유용하다는 것을 시사합니다.
컨텍스트:
sweep는 R의 표준 라이브러리에 있는 함수이며, 인수는 다음과 같습니다.
sweep(x, MARGIN, STATS, FUN="-", check.margin=T, ...)
# x is the data
# STATS refers to the summary statistics which you wish to 'sweep out'
# FUN is the function used to carry out the sweep, "-" is the default
보다시피, 인수는 다음과 유사합니다.apply그래도sweep매개 변수가 하나 더 필요합니다.STATS.
또 다른 주요 차이점은sweep입력 배열과 동일한 모양의 배열을 반환하는 반면, 결과는 다음과 같이 반환됩니다.apply전달된 함수에 따라 달라집니다.
sweep작동 중:
# e.g., use 'sweep' to express a given matrix in terms of distance from
# the respective column mean
# create some data:
M = matrix( 1:12, ncol=3)
# calculate column-wise mean for M
dx = colMeans(M)
# now 'sweep' that summary statistic from M
sweep(M, 2, dx, FUN="-")
[,1] [,2] [,3]
[1,] -1.5 -1.5 -1.5
[2,] -0.5 -0.5 -0.5
[3,] 0.5 0.5 0.5
[4,] 1.5 1.5 1.5
요약하자면, 제가 찾고 있는 것은 모범적인 사용 사례입니다.sweep.
R 설명서, 메일링 목록 또는 '기본' R 소스를 읽었다고 가정하고 암송하거나 링크하지 마십시오.제가 관심 있는 것은 경험이 풍부한 R 프로그래머/분석가들이 어떻게 사용하는지입니다.sweep그들만의 코드로.
sweep()일반적으로 행렬을 행별 또는 열별로 연산할 때 사용되며 연산의 다른 입력은 각 행/열에 대해 다른 값입니다.행 또는 열을 기준으로 연산할지 여부는 다음과 같이 MAIN으로 정의됩니다.apply()제가 "기타 입력"이라고 부르는 값은 STATS에 의해 정의됩니다.따라서 각 행(또는 열)에 대해 STATS에서 값을 가져와 FUN에서 정의한 작업에 사용합니다.
예를 들어 정의한 행렬의 첫 번째 행에 1을 추가하고 두 번째 행에 2를 추가하려면 다음 작업을 수행합니다.
sweep (M, 1, c(1: 4), "+")
저도 솔직히 R 설명서의 정의를 이해하지 못했고, 예시를 찾아보면서 알게 되었습니다.
sweep()는 아래와 같이 열별 또는 행별로 큰 행렬을 체계적으로 조작하는 데 유용할 수 있습니다.
> print(size)
Weight Waist Height
[1,] 130 26 140
[2,] 110 24 155
[3,] 118 25 142
[4,] 112 25 175
[5,] 128 26 170
> sweep(size, 2, c(10, 20, 30), "+")
Weight Waist Height
[1,] 140 46 170
[2,] 120 44 185
[3,] 128 45 172
[4,] 122 45 205
[5,] 138 46 200
물론 이 예는 간단하지만 STATS 및 FUN 인수를 변경하면 다른 조작이 가능합니다.
이 질문은 약간 오래되었지만 최근에 이 문제에 직면했기 때문에 일반적인 스위프 사용은 통계 함수의 소스 코드에서 찾을 수 있습니다.cov.wt가중 공분산 행렬을 계산하는 데 사용됩니다.R 3.0.1의 코드를 보고 있습니다.여기서sweep공분산을 계산하기 전에 열 평균을 빼는 데 사용됩니다.코드의 라인 19에서 중심 벡터는 다음과 같이 도출됩니다.
center <- if (center)
colSums(wt * x)
else 0
그리고 54번째 줄에서 그것은 매트릭스 밖으로 쓸려나갑니다.
x <- sqrt(wt) * sweep(x, 2, center, check.margin = FALSE)
인 코작자가기사있습용다니를 사용하고 .FUN = "-"잠시 혼란스러웠습니다.
한 가지 용도는 배열에 대한 가중 합계를 계산하는 경우입니다.어디에rowSums또는colSums 'sigma=1', '한11'을 의미한다고 할 수 .sweep이 전에 가중 결과를 제공하는 데 사용할 수 있습니다.이 기능은 특히 >=3차원의 어레이에 유용합니다.
이는 @James King의 예에 따라 가중 공분산 행렬을 계산할 때 등에 나타납니다.
다음은 현재 프로젝트를 기반으로 한 또 다른 사례입니다.
set.seed(1)
## 2x2x2 array
a1 <- array(as.integer(rnorm(8, 10, 5)), dim=c(2, 2, 2))
## 'element-wise' sum of matrices
## weights = 1
rowSums(a1, dims=2)
## weights
w1 <- c(3, 4)
## a1[, , 1] * 3; a1[, , 2] * 4
a1 <- sweep(a1, MARGIN=3, STATS=w1, FUN="*")
rowSums(a1, dims=2)
사용할 수 있습니다.sweep다음 코드와 같이 데이터를 확장하고 중앙에 배치하는 기능입니다.:means그리고.sds여기서는 임의입니다(기준 값을 기반으로 데이터를 표준화하려는 몇 가지 기준 값이 있을 수 있음).
df=matrix(sample.int(150, size = 100, replace = FALSE),5,5)
df_means=t(apply(df,2,mean))
df_sds=t(apply(df,2,sd))
df_T=sweep(sweep(df,2,df_means,"-"),2,df_sds,"/")*10+50
이 코드는 원시 점수를 T 점수(평균=50 및 sd=10)로 변환합니다.
> df
[,1] [,2] [,3] [,4] [,5]
[1,] 109 8 89 69 15
[2,] 85 13 25 150 26
[3,] 30 79 48 1 125
[4,] 56 74 23 140 100
[5,] 136 110 112 12 43
> df_T
[,1] [,2] [,3] [,4] [,5]
[1,] 56.15561 39.03218 57.46965 49.22319 40.28305
[2,] 50.42946 40.15594 41.31905 60.87539 42.56695
[3,] 37.30704 54.98946 47.12317 39.44109 63.12203
[4,] 43.51037 53.86571 40.81435 59.43685 57.93136
[5,] 62.59752 61.95672 63.27377 41.02349 46.09661
언급URL : https://stackoverflow.com/questions/3444889/how-to-use-the-sweep-function
'programing' 카테고리의 다른 글
| MySQL에서 문자열을 실행할 수 있습니까? (0) | 2023.09.06 |
|---|---|
| VBA에서 HTTP 요청을 시도할 때 "적절한 개체가 없으면 메서드가 유효하지 않습니다" 오류가 발생합니까? (0) | 2023.06.13 |
| 닷넷의 프로세스 ID를 확인하는 동안 오류가 발생했습니다.응용 프로그램을 호스팅하는 exe.하나 이상의 오류가 발생했습니다. (0) | 2023.06.13 |
| 집합의 모든 하위 집합을 가져오는 방법?(전원 설정) (0) | 2023.06.13 |
| ORA-06508: PL/SQL: 호출 중인 프로그램 단위를 찾을 수 없습니다. (0) | 2023.06.13 |