'스위프'기능 사용 방법


100

R 패키지의 소스를 보면 sweep꽤 자주 사용되는 함수를 볼 수 있습니다 . 때로는 더 단순한 함수가 충분할 때 (예 :) 사용되며 apply, 다른 경우에는 코드 블록을 단계별로 실행하는 데 상당한 시간을 소비하지 않고는 정확히 무엇을하는지 알 수 없습니다.

sweep더 간단한 함수를 사용하여의 효과를 재현 할 수 있다는 사실은 sweep의 핵심 사용 사례를 이해하지 못함을 시사 하고이 함수가 자주 사용된다는 사실은 매우 유용하다는 것을 시사합니다.

문맥:

sweepR의 표준 라이브러리에있는 함수입니다. 인수는 다음과 같습니다.

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하지만 .sweepSTATS

또 다른 주요 차이점은 입력 배열 과 동일한 모양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가 자신의 코드에서 사용하는 방법 입니다.


2
M-dx는 결과를 복제하지 않습니다. 당신은 당신 자신의 질문에 대답했습니다.
John

apply이 결과에 대해 알아낼 수 있는 유일한 사용법 은와 같은 것입니다 t(apply(t(M), 2, "-", dx)).하지만 그것은 꽤 끔찍합니다.
Ken Williams

답변:


84

sweep()일반적으로 행 또는 열별로 행렬을 연산 할 때 사용되며 연산의 다른 입력은 각 행 / 열에 대해 다른 값입니다. 행 또는 열로 작동하는지 여부는에서와 같이 MARGIN에 의해 ​​정의됩니다 apply(). 내가 "다른 입력"이라고 부르는 것에 사용 된 값은 STATS에 의해 정의됩니다. 따라서 각 행 (또는 열)에 대해 STATS에서 값을 가져와 FUN에서 정의한 작업에 사용합니다.

예를 들어 정의한 행렬의 첫 번째 행에 1, 두 번째 행에 2 등을 추가하려면 다음을 수행합니다.

sweep (M, 1, c(1: 4), "+")

솔직히 R 문서의 정의도 이해하지 못했고, 방금 예제를 찾아 보았습니다.


2
약간의 의역 : STATS이 변수에 대한 잘못된 레이블 인 것 같습니다. FUN행렬 ( M이 예에서는) 의 각 요소 값을 수정하는 데 사용되는 입력 입니다. STATS선택한의 크기와 일치하는 크기의 상수 또는 목록 / 벡터 등이 될 수 있습니다 MARGIN. 나는 생각한다.
Roland

16

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 인수를 변경하면 다른 조작이 가능합니다.


6

이 질문은 약간 오래되었지만 최근에이 문제에 직면했기 때문에 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 = "-"있어 잠시 혼란 스러웠습니다.


3

한 가지 용도는 배열에 대한 가중 합계를 계산할 때 입니다. 어디 rowSums또는 colSums'가중치 = 1'을 의미하는 것으로 가정 할 수는 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)

0

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

1
@BenBolker는 답변에서 언급했듯이 현재 샘플 자체의 평균과 SD가 아닌 참조 평균과 SD에 따라 항목을 확장하고 싶을 수 있기 때문입니다. 큰 샘플에서 관리 및 표준화 된 테스트를 처리하고 통계에 따라 작은 샘플 점수를 표준화하려는 경우 발생합니다.
Ehsan88 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.