2016-09-22 3 views
1

apply()와 sweep()을 비교하기 위해 메모를 작성하고 다음과 같은 이상한 차이점을 발견했습니다. 적용 결과가 동일하면 MARGIN = 2가 필요하고 apply는 MARGIN = 2가 필요합니다. 또한 행렬을 지정하는 인수는 apply()에서는 대문자 X이지만 sweep()에서는 소문자입니다.apply() vs. sweep() in R

my.matrix <- matrix(seq(1,9,1), nrow=3) 
row.sums <- rowSums(my.matrix) 
apply.matrix <- apply(X = my.matrix, MARGIN = 2, FUN = function (x) x/row.sums) 
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/") 
apply.matrix - sweep.matrix ##yup same matrix 

sweep()은 "apply-type"함수가 아닙니까? 이건 또 다른 R 버크인가 아니면 내 마음을 잃어 버렸니?

+0

귀하의 질문은 무엇입니까? 즉, 설명서를 읽은 후 정확히 무엇이 불분명합니까? – Roland

+0

질문 : 밀접하게 관련된 두 개의 함수가 실제로 동일한 문제에 대해 다른 구문을 사용합니까? –

+0

R은 오래 동안 개발되었으며 R-Core는 기존 코드를 손상시키지 않도록 세심한주의를 기울였습니다. 이 두 기능은 모두 S의 유산이며 S/S-PLUS와의 호환성은 초기에는 큰 관심사였습니다. – Roland

답변

2

참고 'FUN'에 대한 각 호출은 길이의 벡터를 반환하면 apply,

위한 'N'이면, C (N, 딤 (X '차원의 배열을 반환'적용 ') MARGIN]) '의 경우'N> 1 '에 해당 예에서

, MARGIN은 (와) 두 경우 1 설정해야 할; apply의 반환 값은 전치해야합니다.

my.matrix <- matrix(seq(1,12,1), nrow=4) 
apply.matrix <- t(apply(X = my.matrix, MARGIN = 1, FUN = function(x) x/sum(x))) 
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/") 
all.equal(apply.matrix, sweep.matrix) 
# [1] TRUE 

이 또한 매우 같은 것을 말한다 Can you implement 'sweep' using apply in R?이 대답을 참조하십시오 : 이것은 원래의 매트릭스가 사각형이 있는지 확인하는 가장 쉬운 방법입니다.