2012-11-02 3 views
0

모든 열에 대해 행렬의 z 변환에 대한 아주 기본적인 함수를 작성했습니다. 그것은 다음과 같습니다모든 열에 대한 간단한 z 변환

sapply(MyObject, function(x){(x-mean(x))/sd(x)})

나는 무작위로 매트릭스 내에서 약간의 세포 내 기능을 확인하고 그것을 잘 작동하는 것 같다. 아직도 나는 R이 매우 새롭고 인터넷에서 좋은 예를 찾을 수 없기 때문에이 함수가 괜찮다는 것을 확인하고 싶었다.

+3

당신은 규모의'보고 할 수 있습니다()':-) (누락 된 값이있는 경우 BTW, 함수는 실패합니다 : 당신이 na.rm ='추가해야 TRUE') – chl

+0

이미 거기에 함수가 있다는 것을 알았습니다 :) 그러나 이것은 저와 같은 스케일 펑크를 적용 할 때'sapply (MyObject, function (x) {scale (x)})'전적으로 다른 값을 얻습니다 ... 전체 매트릭스에서 평균 및 SD로 스케일 변환을 실행하고 있을까요? – Joschi

+2

'scale()'을 적용하기 위해'sapply()'가 필요하지 않습니다. 그냥'scale (MyObject)'를 수행하십시오. 결과는 비슷해야한다. (둘 다 비슷하지만 행렬이되지만'scale()'결과는 속성을 가질 것이다). –

답변

4

이 작업을 수행하는 scale()을 확인해야합니다.

기능이 올바로 작동하고 있습니다. na.rm = TRUEsd()mean() 함수 호출에 모두 추가해야합니다.

sapply() 대신 sweep()을 사용하여 함수를 쓰겠습니다 (scale()을 사용하지 않는 경우). 예 : 사용 중

ztran <- function(x, na.rm = TRUE) { 
    mns <- colMeans(x, na.rm = na.rm) 
    sds <- apply(x, 2, sd, na.rm = na.rm) 
    x <- sweep(x, 2, mns, "-") 
    x <- sweep(x, 2, sds, "/") 
    x 
} 

우리는

> df <- data.frame(matrix(1:9, ncol = 3)) 
> ztran(df) 
    X1 X2 X3 
1 -1 -1 -1 
2 0 0 0 
3 1 1 1 
> scale(df) 
    X1 X2 X3 
[1,] -1 -1 -1 
[2,] 0 0 0 
[3,] 1 1 1 
attr(,"scaled:center") 
X1 X2 X3 
2 5 8 
attr(,"scaled:scale") 
X1 X2 X3 
1 1 1 

sweep 작동 이런 종류의 매우 유용한 벡터화 도구입니다 있습니다. sapply()은 원하는 행방이 아닌 행렬로 단순화됩니다. sweep()이 작업을 수행하지 않습니다

> class(ztran(df)) 
[1] "data.frame" 
> class(sapply(df, function(x){(x-mean(x))/sd(x)})) 
[1] "matrix" 
+0

확인. 나는이 일을 얻었다. 그러나 나는 '스위프 (sweep)'의 장점을 잘 이해하지 못했는지 확신 할 수 없다. 그 스윕은 내가 선택한 열에 대해 분리 된 함수를 실행하도록 허용하고, sapply는 자동으로 전체 행렬을 처리합니까? – Joschi

+1

아니요,'sweep()'은 모든 열 ('2') 또는 행 ('2'에서'1'로 변경)]에서 작동합니다. 이점은 i)'sweep()'이 벡터화되고,'sapply()'솔루션이 아니라 단지 루프를 감추고 있다는 것입니다. 'sapply()'는 행렬을 단순화함으로써 목격되는 것처럼 데이터 프레임과 잘 일치하지 않습니다. 둘 다 당신이 작업 할 컬럼을 선택할 수있게 해준다 :'sweep (df [, c (1,3)], ....)'또는'sapply (df [, c (1,3)] ....)'. –

+0

확인. 지금 그것의 더 명확한. 당신의 도움을 주셔서 감사합니다! – Joschi

관련 문제