[r] R의 데이터 열 표준화

spam스팸 메시지와 관련된 58 열과 약 3500 행의 데이터를 포함 하는 데이터 세트 가 있습니다.

앞으로이 데이터 세트에서 선형 회귀를 실행할 계획이지만 사전 처리를 수행하고 평균 및 단위 분산이 0이 아닌 열을 표준화하고 싶습니다.

이 문제를 해결하는 가장 좋은 방법은 R을 사용한다는 것 입니다 .R로 정규화를 달성하는 방법 을 묻고 싶습니다 . 이미 데이터를 올바르게로드했으며이 작업을 수행 할 패키지 나 방법을 찾고 있습니다.



답변

평균 0과 표준 편차 1을 원한다고 가정해야합니다. 데이터가 데이터 프레임에 있고 모든 열이 숫자 scale이면 데이터 에서 함수를 호출하여 원하는 것을 수행 할 수 있습니다.

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)

# check that we get mean of 0 and sd of 1
colMeans(scaled.dat)  # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)

내장 함수를 사용하는 것이 고급입니다. 이 고양이처럼 :

여기에 이미지 설명을 입력하십시오


답변

질문이 오래되었고 하나의 답변이 수락됨을 알기 위해 참고할 다른 답변을 제공하겠습니다.

scale모든 변수의 크기를 조정한다는 사실에 의해 제한됩니다 . 아래의 솔루션을 사용하면 다른 변수는 변경하지 않고 특정 변수 이름 만 확장 할 수 있습니다 (변수 이름은 동적으로 생성 될 수 있음).

library(dplyr)

set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2), 
                  y = runif(10, 3, 5),
                  z = runif(10, 10, 20))
dat

dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
dat2

이것은 나에게 이것을 준다 :

> dat
          x        y        z
1  29.75859 3.633225 14.56091
2  30.05549 3.605387 12.65187
3  30.21689 3.318092 13.04672
4  29.53086 3.079992 15.07307
5  30.08582 3.437599 11.81096
6  30.10121 4.621197 17.59671
7  29.88505 4.051395 12.01248
8  29.89067 4.829316 12.58810
9  29.88711 4.662690 19.92150
10 29.82199 3.091541 18.07352

> dat2 <- dat %>% mutate_at(c("y", "z"), ~(scale(.) %>% as.vector))
> dat2
          x          y           z
1  29.75859 -0.3004815 -0.06016029
2  30.05549 -0.3423437 -0.72529604
3  30.21689 -0.7743696 -0.58772361
4  29.53086 -1.1324181  0.11828039
5  30.08582 -0.5946582 -1.01827752
6  30.10121  1.1852038  0.99754666
7  29.88505  0.3283513 -0.94806607
8  29.89067  1.4981677 -0.74751378
9  29.88711  1.2475998  1.80753470
10 29.82199 -1.1150515  1.16367556

편집 1 (2016) : Julian의 의견에 따르면 : 출력 scale은 Nx1 행렬이므로 이상적으로 as.vector행렬 유형을 다시 벡터 유형으로 변환 하려면를 추가해야합니다 . 줄리안 감사합니다!

편집 2 (2019) : 인용 Duccio A.의 의견 : 최신 dplyr (버전 0.8)의 경우 다음과 같이 목록으로 dplyr :: funcs를 변경해야합니다dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))

편집 3 (2020) : @mj_whales 덕분에 : 이전 솔루션은 더 이상 사용되지 않으므로 이제 사용해야 mutate_at합니다.


답변

이것은 3 살입니다. 여전히 다음을 추가해야한다고 생각합니다.

가장 일반적인 정규화는 평균을 빼고 변수의 표준 편차로 나누는 z 변환 입니다. 결과는 mean = 0이고 sd = 1입니다.

이를 위해 패키지가 필요하지 않습니다.

zVar <- (myVar - mean(myVar)) / sd(myVar)

그게 다야.


답변

‘Caret’패키지는 데이터 전처리 방법 (예 : 중심 및 스케일링)을 제공합니다. 다음 코드를 사용할 수도 있습니다.

library(caret)
# Assuming goal class is column 10
preObj <- preProcess(data[, -10], method=c("center", "scale"))
newData <- predict(preObj, data[, -10])

자세한 내용은 http://www.inside-r.org/node/86978


답변

Dason이 언급 한 솔루션을 사용했을 때 결과적으로 데이터 프레임을 얻는 대신 숫자 벡터 (df의 배율 값)를 얻었습니다.

누군가 같은 문제가 발생하면 다음과 같이 as.data.frame ()을 코드에 추가해야합니다.

df.scaled <- as.data.frame(scale(df))

이것이 동일한 문제를 가진 ppl에 유용 할 수 있기를 바랍니다!


답변

clusterSim 패키지의 data.Normalization 함수를 사용하여 데이터를 쉽게 정규화 할 수 있습니다. 다른 데이터 정규화 방법을 제공합니다.

    data.Normalization (x,type="n0",normalization="column")

인수

x
벡터, 행렬 또는 데이터 세트 유형
정규화 : n0-정규화 없음

n1-표준화 ((x-mean) / sd)

n2-위치 표준화 ((x-median) / mad)

n3-단위 화 ((x-mean) / range)

n3a-위치 단위 화 ((x-median) / 범위)

n4-최소값이 0 인 단위 ((x-min) / 범위)

n5-<-1,1> 범위의 정규화 ((x-mean) / max (abs (x-mean)))

n5a-<-1,1> 범위의 위치 정규화 ((x-median) / max (abs (x-median)))

n6-몫 변환 (x / sd)

n6a-위치 몫 변환 (x / mad)

n7-몫 변환 (x / range)

n8-몫 변환 (x / max)

n9-몫 변환 (x / mean)

n9a-위치 몫 변환 (x / median)

n10-몫 변환 (x / sum)

n11-몫 변환 (x / sqrt (SSQ))

n12-정규화 ((x-mean) / sqrt (sum ((x-mean) ^ 2)))

n12a-위치 정규화 ((x-median) / sqrt (sum ((x-median) ^ 2)))

n13-중심점이 0 인 정규화 ((x-midrange) / (range / 2))

정규화
“열”-변수 별 정규화, “행”-객체 별 정규화


답변

함께 dplyrv0.7.4 모든 변수를 사용하여 확장 할 수 있습니다 mutate_all():

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)

set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2),
              y = runif(10, 3, 5),
              z = runif(10, 10, 20))

dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#>         x      y       z
#>     <dbl>  <dbl>   <dbl>
#>  1 -0.827 -0.300 -0.0602
#>  2  0.663 -0.342 -0.725 
#>  3  1.47  -0.774 -0.588 
#>  4 -1.97  -1.13   0.118 
#>  5  0.816 -0.595 -1.02  
#>  6  0.893  1.19   0.998 
#>  7 -0.192  0.328 -0.948 
#>  8 -0.164  1.50  -0.748 
#>  9 -0.182  1.25   1.81  
#> 10 -0.509 -1.12   1.16

다음을 사용하여 특정 변수를 제외 할 수 있습니다 mutate_at().

dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#>        x      y       z
#>    <dbl>  <dbl>   <dbl>
#>  1  29.8 -0.300 -0.0602
#>  2  30.1 -0.342 -0.725 
#>  3  30.2 -0.774 -0.588 
#>  4  29.5 -1.13   0.118 
#>  5  30.1 -0.595 -1.02  
#>  6  30.1  1.19   0.998 
#>  7  29.9  0.328 -0.948 
#>  8  29.9  1.50  -0.748 
#>  9  29.9  1.25   1.81  
#> 10  29.8 -1.12   1.16

2018-04-24에 reprex 패키지 (v0.2.0)로 작성되었습니다.