2017-10-18 2 views
0

사용자 정의 된 정규화에 의해 데이터 프레임의 선택된 열을 표준화하려고합니다. 지금까지 나는 최소한의 예로서R에서 모드 정규화를 위해 데이터 프레임 슬라이스를 히스토그램 함수에 전달하는 방법?

library(tidyr) 
library(ggplot2) 

Mode <- function(x, na.rm = TRUE) { 
    x <- lapply(x, as.numeric) 
    distribution <- hist(x, breaks = 50, plot = FALSE) 
    distribution$mids[which.max(distribution$counts)] 
} 

data_normalised <- lapply(mtcars[,-9:-12], function(x) {(x-Mode(x))/(sd(x))}) 

으로 예를 들어 설명합니다. 그러나 hist는 "x는 숫자 여야합니다."라고 불평하고 있습니다. 이 문제가 해결 될 수 있다고 생각했습니다.

x <- lapply(x, as.numeric) 

작동하지 않는 것으로 보았습니다. 나는 eighter 작동하지 않습니다

hist(mtcars[[-9:-12]]) 

로, HIST이

hist(mtcars[[3]]) 

작동하지만 DF 슬라이스와 HIST 기능을 결합 할 수있는 방법을 찾을 수 있다는 것을 알고.

Idealy 나는 Mode() 함수가 sd() 함수로 작동하기를 원합니다. df 컬럼을 취하여 값을 돌려 준다.

도움 주셔서 감사합니다.

+0

함수'Mode'는 아무 것도 반환하지 않습니다. 함수를 종료하기 전에'return() '과 관심이있는 값을 추가해야한다. – R18

답변

0

Mode()에서 class(x)'numeric'입니다 (즉, 길이가 32 인 숫자 벡터를 가짐). 그런 다음 lapply()을 사용하여 as.numeric()x에 적용합니다.

Mode <- function(x, na.rm = TRUE) { 
    x <- as.numeric(x) 
    distribution <- hist(x, breaks = 50, plot = FALSE) 
    distribution$mids[which.max(distribution$counts)] 
} 

당신은 다음과 같이 진행 할 수 있습니다 :이 단계 후에, class(x)는 as.numeric는, 실제로 벡터의 요소를 통해 루프 대신 그냥 모드 기능에 x <- as.numeric(x)를 사용하지 않는 벡터화되어 있기 때문에 'list'입니다 당신했고, 그것은 오류가 발생하지 않습니다 당신이 다시 data.frame을 얻고 싶은 경우에 당신은 사용할 수

data_normalised <- lapply(mtcars[,-9:-12], function(x) {(x-Mode(x))/(sd(x))}) 

cbind() :

data_normalised <- do.call("cbind", data_normalised) 

그리고 여러분은 다음과 같이 나타납니다 :

head(data_normalised) 
      mpg   cyl  disp   hp  drat   wt  qsec   vs 
[1,] 0.9540484 -1.09187321 0.6858229 0.03646289 1.54298263 -0.84827399 -0.35815351 -0.01984063 
[2,] 0.9540484 -1.09187321 0.6858229 0.03646289 1.54298263 -0.58765969 -0.04476919 -0.01984063 
[3,] 1.2527070 -2.21174317 0.2662607 -0.21148473 1.44946853 -1.15487905 0.84501845 1.96422286 
[4,] 1.0204170 -1.09187321 1.4765365 0.03646289 0.00935141 -0.24017396 1.30949879 1.96422286 
[5,] 0.5724290 0.02799675 2.2995240 0.98449790 0.14027115 -0.01022017 -0.04476919 -0.01984063 
[6,] 0.4728762 -1.09187321 1.2102758 -0.03646289 -0.58913882 0.01022017 1.74599838 1.96422286 
+0

우수한 작품! 고맙습니다! 아마도 여기에 몇 가지 기본 개념을 이해하지 못했습니다. 나는 기저귀가 이미 데이터 프레임을 돌려 준다고 생각합니다. – Neudrino

관련 문제