반응형

[R] 변수의 유형 (타입, type) 확인 및 변경 - as.factor(), as.numeric(), str()

 

변수는 보통 다음 네 가지의 종류로 나누곤 한다.

 

1) 명목 척도: 범주형, 순서 없음

 예시) 성별 - "남성", "여성"

2) 순서 척도: 범주형, 순서 있음

 예시) 암의 병기 - "1기", "2기", "3기", "4기"

3) 등간 척도: 연속형, 곱셈 불가

 예시) IQ 점수 - IQ가 150인 사람보다 100인 사람은 50점이 더 높다. 100점인 사람이 50점인 사람도 똑같이 50점이 더 높다. 하지만 100점인 사람이 50점보다 두 배 더 똑똑하다고 할 수는 없다.

4) 비율 척도: 연속형, 곱셈 가능

 예시) 나이 - "1세", "55세",...

 

그런데, 학문적으로 저렇게 나눈다고 하여도, 의학 통계를 하는 사람에게 저렇게 세분하는 것이 그렇게까지 중요한 것은 아니다. 단지 우리에게는 범주형 (비연속형, 이산형) 변수와 연속형 변수가 있다는 사실만이 중요하다. 이번 포스팅에서는 변수의 형태를 확인하고, 원하는 경우 다른 유형으로 변경하는 방법에 대해 알아보겠다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.11.21)

 

분석용 데이터 (update 22.11.21)

2022년 11월 21일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 범주형 자료 분석 - 모평균 검정 - 반복 측정 자료 분석 - 통계

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

데이터 유형 확인하기 - str()

코드

데이터에 있는 변수들의 유형을 확인할 때에는 str()이라는 함수를 쓴다. 내장함수이므로 별도 패키지의 설치가 필요 없다.

str(df)

 

결과

spc_tbl_ [1,000 × 14] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ IDNO       : num [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
 $ SEX        : num [1:1000] 0 0 0 0 1 1 1 1 0 1 ...
 $ SMOK       : num [1:1000] 1 2 0 0 2 1 1 1 1 0 ...
 $ ALCOHOL    : num [1:1000] 1 1 0 0 1 1 1 1 1 0 ...
 $ RESID      : num [1:1000] 1 2 2 0 1 2 0 2 0 0 ...
 $ TWIN       : num [1:1000] 0 0 0 0 0 0 0 0 0 0 ...
 $ RH         : num [1:1000] 1 1 1 1 1 1 1 1 1 1 ...
 $ HTN        : num [1:1000] 1 1 0 1 1 0 0 0 1 0 ...
 $ SBP        : num [1:1000] 142 151 120 148 165 ...
 $ ALT        : num [1:1000] 39.1 37.4 31.4 19.7 35.6 ...
 $ AST        : num [1:1000] 45.7 37.4 33.6 23.4 27.6 ...
 $ ALT_POSTMED: num [1:1000] 38.4 28.6 34.9 32.8 32 ...
 $ FVC_pPRED  : num [1:1000] 73.4 54.7 121.5 77.6 91.6 ...
 $ TRANSPORT  : chr [1:1000] "도보" "도보" "도보" "도보" ...

하나씩 살펴보면 다음과 같다.

맨 앞에 있는 "IDNO", "SEX", "SMOK", "ALCOHOL", ... ,"TRNASPORT"는 변수의 이름이다.

"IDNO"부터 "FVC_pPRED"까지는 num이라고 적혀있다. 이는 numeric의 약자이며, 숫자형 (연속형) 변수임을 의미한다.

"TRANSPORT"는 chr이라고 적혀있다. 이는 character의 약자이며, 문자형 변수임을 의미한다.

 

그런데, 서두에 우리는 변수를 범주형, 연속형 변수로 나누기로 했다. 그런데, 숫자로 이루어진 변수는 모두 연속형 변수로 취급되고 있고, 문자가 들어간 변수는 그저 문자형 변수로 취급되고 있다. 그런데 이는 적절하지 않다. 예를 들어 성별을 나타내는 "SEX"변수는 1과 2로 이루어진 범주형 변수다. 여성을 나타내는 0이 남성을 나타내는 1보다 작다고 할 수 없는 것이다. 그저 숫자로 나타낸 것 뿐이다. 여성을 2로 나타낼 수도 있었는데, 그렇다고 하여 여성이 남성보다 크다고 할 수는 없는 것이다.

 

 코드북을 살펴보면 알 수 있지만, 다음과 같이 변수를 구분할 수 있다.

변수명 변수 종류
SEX 범주형
SMOK 범주형
ALCOHOL 범주형
RESID 범주형
TWIN 범주형
RH 범주형
HTN 범주형
SBP 연속형
ALT 연속형
AST 연속형
ALT_POST 연속형
FVC_pPRED 연속형
TRANSPORT 범주형

 

따라서, "IDNO", "SEX", "SMOK", "ALCOHOL", "RESID", "TWIN", "RH", "HTN", "TRANSPORT"는 범주형 자료로 바꿔주어야 한다. 이럴 때에는 범주형 변수로 바꾸어주는 as.factor() 함수를 사용해야 한다.

 

범주형 변수로 바꾸기 - as.factor()

코드

df$SEX<-as.factor(df$SEX)
df$SMOK<-as.factor(df$SMOK)
df$ALCOHOL<-as.factor(df$ALCOHOL)
df$RESID<-as.factor(df$RESID)
df$TWIN<-as.factor(df$TWIN)
df$RH<-as.factor(df$RH)
df$HTN<-as.factor(df$HTN)
df$TRANSPORT<-as.factor(df$TRANSPORT)

df$SEX<-as.factor(df$SEX) df 데이터의 "SEX"변수를 범주형으로 바꾸어 df 데이터의 "SEX"변수로 저장하라. 이미 SEX변수가 있으므로 덮어쓰도록 한다.

 

다시 str() 함수를 사용하여 변수의 종류를 확인해보면 다음과 같이 변한 것을 알 수 있다.

코드

str(df)

 

결과

$ IDNO       : num [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
 $ SEX        : Factor w/ 2 levels "0","1": 1 1 1 1 2 2 2 2 1 2 ...
 $ SMOK       : Factor w/ 3 levels "0","1","2": 2 3 1 1 3 2 2 2 2 1 ...
 $ ALCOHOL    : Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 2 2 1 ...
 $ RESID      : Factor w/ 3 levels "0","1","2": 2 3 3 1 2 3 1 3 1 1 ...
 $ TWIN       : Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ RH         : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
 $ HTN        : Factor w/ 2 levels "0","1": 2 2 1 2 2 1 1 1 2 1 ...
 $ SBP        : num [1:1000] 142 151 120 148 165 ...
 $ ALT        : num [1:1000] 39.1 37.4 31.4 19.7 35.6 ...
 $ AST        : num [1:1000] 45.7 37.4 33.6 23.4 27.6 ...
 $ ALT_POSTMED: num [1:1000] 38.4 28.6 34.9 32.8 32 ...
 $ FVC_pPRED  : num [1:1000] 73.4 54.7 121.5 77.6 91.6 ...
 $ TRANSPORT  : Factor w/ 3 levels "대중교통","도보",..: 2 2 2 2 1 1 2 3 1 1 ...

위에서 "IDNO", "SEX", "SMOK", "ALCOHOL", "RESID", "TWIN", "RH", "HTN", "TRANSPORT"의 변수 형태는 "num"이었는데 "Factor"로 바뀐 것을 알 수 있다.

 "SMOK"는 "Factor w/ 3 levels"이라고 적혀있는데, 이는 "Factor with 3 levels"의 약자로 "범주형 변수인데, 3개의 범주가 존재한다"는 뜻이다. 실제로도 '비흡연자', '과거 흡연자', '현재 흡연자'로 나누어놨으니 맞게 변환된 것을 알 수 있다.

 

연속형 변수, 문자형 변수로 바꾸기 - as.numeric(), as.character()

위와 같이 바꾸고 나서 가끔은 다시 연속형 변수로 바꾸거나 문자형 변수로 되돌려야 할 때가 있을 수 있다. 이때는 각각 as.numeric()과 as.character() 함수를 사용하면 된다. "RESID" 변수를 연속형 변수로, "TRANSPORT"변수를 문자형 변수로 되돌려보자.

 

코드

df$RESID<-as.numeric(df$RESID)
df$TRANSPORT<-as.character(df$TRANSPORT)

 

다시 str() 함수를 사용하여 변수의 종류를 확인해보면 원하는 대로 변한 것을 알 수 있다.

코드

str(df)

 

결과

 $ IDNO       : num [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
 $ SEX        : Factor w/ 2 levels "0","1": 1 1 1 1 2 2 2 2 1 2 ...
 $ SMOK       : Factor w/ 3 levels "0","1","2": 2 3 1 1 3 2 2 2 2 1 ...
 $ ALCOHOL    : Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 2 2 1 ...
 $ RESID      : num [1:1000] 2 3 3 1 2 3 1 3 1 1 ...
 $ TWIN       : Factor w/ 3 levels "0","1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ RH         : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
 $ HTN        : Factor w/ 2 levels "0","1": 2 2 1 2 2 1 1 1 2 1 ...
 $ SBP        : num [1:1000] 142 151 120 148 165 ...
 $ ALT        : num [1:1000] 39.1 37.4 31.4 19.7 35.6 ...
 $ AST        : num [1:1000] 45.7 37.4 33.6 23.4 27.6 ...
 $ ALT_POSTMED: num [1:1000] 38.4 28.6 34.9 32.8 32 ...
 $ FVC_pPRED  : num [1:1000] 73.4 54.7 121.5 77.6 91.6 ...
 $ TRANSPORT  : chr [1:1000] "도보" "도보" "도보" "도보" ...

 

 

만약, 이 모든 것을 출력하고 싶지 않으면 (특히 변수가 많은 데이터의 경우 더더욱 그렇다) 특정 변수의 형태만 확인할 수도 있다.

"RESID"와 "TRANSPORT"의 형태를 확인해보자.

 

코드

str(df$RESID)
str(df$TRANSPORT)

 

결과

 num [1:1000] 2 3 3 1 2 3 1 3 1 1 ...
 
 chr [1:1000] "도보" "도보" "도보" "도보" "대중교통" ...

각각 "numeric"과 "character"로 나타나는 것을 알 수 있다.

 

코드 정리

#워킹 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#데이터 변수 유형 확인하기
str(df)

#범주형 변수로 변경하기
df$SEX<-as.factor(df$SEX)
df$SMOK<-as.factor(df$SMOK)
df$ALCOHOL<-as.factor(df$ALCOHOL)
df$RESID<-as.factor(df$RESID)
df$TWIN<-as.factor(df$TWIN)
df$RH<-as.factor(df$RH)
df$HTN<-as.factor(df$HTN)
df$TRANSPORT<-as.factor(df$TRANSPORT)

#숫자형 변수로 변경하기
df$RESID<-as.numeric(df$RESID)

#문자형 변수로 변경하기
df$TRANSPORT<-as.character(df$TRANSPORT)

#특정 변수의 유형만 확인하기
str(df$RESID)
str(df$TRANSPORT)

 

 

참고로, as.factor()가 아닌 factor()라는 함수도 존재한다. 기능은 같으나 as.factor()가 특정 상황에서 조금 더 빠르게 작동하여 as.factor()를 본문에서는 소개했지만, factor() 함수를 사용해도 같은 결과를 내니 원하는 것을 사용하면 된다.

 

 

 

[R] 변수의 유형 (타입, type) 확인 및 변경 정복 완료!

 

작성일: 2022.11.21.

최종 수정일: 2022.11.21.

이용 프로그램: R 4.2.2

RStudio v2022.07.2

RStudio 2022.07.2+576 "Spotted Wakerobin" Release

운영체제: Windows 10, Mac OS 12.6.1

반응형

+ Recent posts