2.9 객체의 유형 판별 및 변환

지금까지 R 객체를 알아보면서 is.na(), is.null() 등 스칼라의 데이터 타입을 확인하는 함수부터 str(), attributes(), class()와 같이 객체의 속성 및 구조에 대해 확인하는 함수들에 대해 간략히 소개함.

R은 스크립트 언어이기 때문에 모든 명령 실행이 함수 기반으로 이루어짐. 특정 객체에만 적용할 수 있는 함수들이 있는 반면, 함수를 통해 새로운 속성을 갖는 객체가 생성되기도 함. 그렇기 때문에 함수 적용 또는 반환 후 생성된 객체의 타입을 확인하거나 객체의 유형을 변환하는 작업은 R에서 데이터 분석을 진행하는 과정에서 빈번하게 발생함.

객체 유형 판별을 위해 is.type_name(), 객체 타입 변환을 위해 as.type_name() 형태의 함수를 제공함. 지금까지 배운 R 객체에 대한 is.as. 계열 함수는 아래와 같음.

Table 2.7: R 객체 타입 판별 및 변환 함수
is 계열 함수 as 계열 함수 설명
is.factor() as.factor() 주어진 객체가 factor 형인지 판단/변환
is.ordered() as.ordered 주어진 객체가 순서형 factor인지 판단/변환
is.numeric() as.numeric() 주어진 객체가 수치형인지 판단/변환
is.character() as.character() 주어진 객체가 문자형인지 판단/변환
is.matrix() as.matrix() 주어진 객체가 행렬인지 판단/변환
is.array() as.array() 주어진 객체가 배열인지 판단/변환
is.list() as.list() 주어진 객체가 리스트인지 판단/변환
is.data.frame() as.data.frame() 주어진 객체가 데이터 프레임인지 판단/변환

  • is/as계열 함수 사용 예시
x <- c("M", "F"); f <- factor(x)
# x가 문자열인가?
is.character(x)
[1] TRUE
# f가 factor인가?
is.factor(f)
[1] TRUE
#f가 숫자형인가?
is.numeric(f)
[1] FALSE
# f를 수치형으로 변환
f <- as.numeric(f)
is.numeric(f)
[1] TRUE
f
[1] 2 1
# 다시 f를 factor형으로 변환
as.factor(f)
[1] 2 1
Levels: 1 2

  • 2차원 데이터 객체 유형 판별 및 변환
X <- matrix(rnorm(9), 3)
d <- data.frame(group = rep(LETTERS[1:3], each = 2), 
                meas = c(mapply(rnorm, 
                                c(2, 2, 2),
                                c(1, 2, 3), 
                                c(1, 1, 1))))

# 객체 유형 확인
is.matrix(X); is.data.frame(X)
[1] TRUE
[1] FALSE
is.matrix(d); is.data.frame(d)
[1] FALSE
[1] TRUE
# 객체 유형 변환
as.data.frame(X); as.matrix(d)
     group meas      
[1,] "A"   "2.028870"
[2,] "A"   "1.996936"
[3,] "B"   "2.835169"
[4,] "B"   "1.105901"
[5,] "C"   "1.095014"
[6,] "C"   "2.927883"
as.list(X); as.list(d)
[[1]]
[1] 0.3288415

[[2]]
[1] 0.2479955

[[3]]
[1] -0.7521625

[[4]]
[1] -0.02180829

[[5]]
[1] 1.354002

[[6]]
[1] -0.1578651

[[7]]
[1] -0.3734678

[[8]]
[1] -2.285178

[[9]]
[1] -1.143963
$group
[1] "A" "A" "B" "B" "C" "C"

$meas
[1] 2.028870 1.996936 2.835169 1.105901 1.095014 2.927883