본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

타입 판별, 타입변환

반응형

타입판별

 

 

데이터를 처리하기 위해 여러 함수를 호출하다 보면 반환된 결과의 타입이 무엇인지 분명하지 않을 때가 많다. 이 경우 다음 함수들을 사용하여 데이터 타입을 손쉽게 판단할 수 있다.

함수 의미
class(x) 객체 x의 클래스
str(x) 객체 x의 내부 구조
is.factor(x) 주어진 객체 x가 팩터인가
is.numeric(x) 주어진 객체 x가 숫자를 저장한 벡터인가
is.character(x) 주어진 객체 x가 문자열을 저장한 벡터인가
is.matrix(x) 주어진 객체 x가 행렬인가
is.array(x) 주어진 객체 x가 배열인가
is.data.frame(x) 주어진 객체 x가 데이터 프레임인가

 

다음은 벡터, 행렬, 데이터 프레임에 class()를 적용하여 클래스를 구하는 예를 보여준다.

>class(c(1,2))
[1]"numeric"

>class(matrix(c(1,2)))
[1]"matrix"

>class(data.frame(x=c(1,2),y=c(3,4)))
[1]"data.frame"

 

class()는 문자열로 데이터 타입을 반환하는데, 이 예에서는 숫자형 벡터에 numeric, 행렬에 matrix, 데이터 프레임에 data.frame을 반환했다. 특히 class()에 백터를 인자로 전달한경우 numeric이 반환되었는데, 이는 벡터에 저장된 값이 숫자기 때문이다. 벡터에 저장된 데이터 타입에 따라 이 값은 logical, character, factor 등이 될 수 있다.

 

데이터 타입은 str()로도 확인해볼 수 있다. 다음 예에서 벡터와 행렬의 결과가 유사해 보이지만 벡터의 경우 차원이 [1:2](1차원에 값이 2개)라고 표시되어 있는 반면 행렬은 차원이 [1:2,1](2차원이고 2행 1열)로 표시되어 있는 점이 다르다.

>str(c(1,2))
num [1:2] 1 2

>str(matrix(c(1,2)))
num [1:2, 1] 1 2

>str(list(c(1,2)))
list of 1
$: num [1:2] 1 2

>str(data.frame(x=c(1,2)))
'data.frame':    2 obs. of 1 variable:
$ x: num 1 2

 

R의 데이터 타입에는 타입 이름이 'typename'이라 할 때 'is.typename()'형태의 함수가 존재한다. 이 함수들은 주어진 객체 x가 'typename'데이터 타입에 해당하는지를 판별하는 용도로 사용한다. 이러한 함수의 예로 팩터인지 여부를 알려주는 is.factor(), 숫자를 저장한 벡터인지를 알려주는 is.numeric(), 문자열을 저장한 벡터인지를 알려주는 is. character() 등을 들 수 있다. 다음에 몇 가지 함수의 사용 예를 보였다.

>is.factor(factor(c("m","f")))
[1] TRUE
>is.numeric(1:5)
[1] TRUE
>is.character(c("a","b"))
[1] TRUE
>is.data.frame(data.frame(x=1:5))
[1] TRUE

 

'is.typename()'형태의 함수 목록은 제일 위의 표를 참조하기 바란다.

 

 

 

타입변환

R의 형 변환은 암시적으로 발생할 수 있고, 때에 따라 형 변환이 전혀 예상치 않은 곳에서 일어난다. 예를 들어, 데이터 프레임 d에 2개 컬럼이 있고 각 컬럼의 데이터 타입이 numeric(숫자를 저장한 벡터)이라고 가정하자. 이때 d[, 1] 첫 번째 컬럼의 데이터를 데이터 프레임이 아닌 numeric(즉, 벡터)으로 변환한다. d에 대한 연산으 ㅣ결과가 데이터 프레임이 아니라 numeric이라는 점은 사용자를 당황하게 할 수 있는 점이며, 이러한 변환을 피하고 싶다면 drop=FALSE를 지정해야 한다. 또는 파일에서 문자열을 불러들였을 때 data.frame()으로 데이터 프레임을 생성하면서 stringsAsFactor=FALSE를 지정하지 않으면 문자열이 character(문자열 벡터)가 아니라 팩터가 된다.

 

이와 같은 암시적 형 변환에 대비하기 위해 모든 의심스러운 함수 호출 뒤에는 앞에서 설명한 str(), class()를 사용해 현재 사용하는 데이터가 올바른 데이터 타입인지 계속 확인할 필요가 있다.

 

반면 타입을 강제로 변환하고자 할 때도 있을 것이다. 문자열 벡터를 팩터로 변환하는 경우 등이 그 예다. 이러한 변환을 하는 한 가지 방법은 타입 이름이 'typename'이라 할 때 as.typename()'이라는 함수를 사용하는 것이다. 다음에 관련 함수의 목록을 보였다.

함수 의미
as.factor(x) 주어진 객체 x를 팩터로 변환
as.numeric(x) 주어진 객체 x를 숫자를 저장한 벡터로 변환
as.character(x) 주어진 객체 x를 문자열을 저장한 벡터로 변환
as.matrix(x) 주어진 객체 x를 행렬로 변환
as.array(x) 주어진 객체 x를 배열로 변환
as.data.frame(x) 주어진 객체 x를 데이터 프레임으로 변환

 

또 다른 타입 변환 방법은 factor(), data.frame() 등과 같이 데이터를 생성하는 함수에 다른 타입의 데이터를 인자로 넘겨주는 것이다. 이 경우 필요에 따라 형 변환이 수행된다.

 

'as.typename()' 유형부터 살펴보자. 다음은 "a","b","c"가 저장된 문자열 벡터를 팩터로 변환했다가 다시 벡터로 변환하는 예다.

>x<-c("a","b","c")
>as.factor(x)
[1] a b c
Levels : a b c

>as.character(as.factor(x))
[1] "a" "b" "c"

 

다음은 행렬을 데이터 프레임으로 변환하는 예다.

>x<-matrix(1:9, ncol=3)
>as.data.frame(x)
  V1 V2 V3
1 1   4   7
2 2   5   8
3 3   6   9

 

또는 factor(), matrix(), data.frame() 등과 같은 데이터 생성 함수에 곧바로 다른 타입을 넘겨 형변환을 할 수도 있다. 다음은 행렬을 데이터 프레임으로 변환하기 위해 matrix()의 결과를 data.frame()에 곧바로 넘긴 예다.

>(x<-data.frame(matrix(c(1,2,3,4), ncol=2)))
   X1 X2
1  1   3
2  2   4

 

다음은 리스트를 data.frame()에 넘겨 데이터 프레임으로 변환한 예다.

>data.frame(list(x=c(1,2), y=c(3,4)))
   x y
1 1 3
2 2 4

 

두 가지 방법이 모두 가능하다면 그 차이가 무엇일까? 'as.typename()'은 표현이 명확하고 간략하지만 경우에 따라 지원하는 변환의 정도가 약하다. 예를 들어, c("m","f")의 벡터를 as.factor()로 변환하는 경우를 생각해보자. 이 경우 f가 알파벳 순서상 m보다 앞서므로 as.factor(c("m","f"))의 결과에서 팩터의 레벨은 "f m"으로 정해진다. 펙터의 레벨을 "m f"로 하려면 어떻게 해야할까? as.factor()는 변환할 데이터 이상의 인자를 받지 않으므로 as.factor()를 사용할 때 팩터의 레벨을 "m f"로 지정할 수 있는 방법이 없다. 팩터 레벨의 순서를 "m f"로 하고 싶다면 다음과 같이 factor()함수를 써야 한다.

 

>as.factor(c("m","f"))
[1] m f
Levels : f m 

>factor(c("m", "f")), levels=c("m","f"))
[1]Levels : m f

 

따라서 상황에 따라 두 가지 방법을 모두 사용해보고 help(함수명)으로 볼 수 있는 도움말을 참고해 적절한 방식을 찾아 형 변환을 수해애해야 한다.

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

연산  (0) 2020.01.30
흐름 제어(조건문과 반복문)  (0) 2020.01.30
데이터 프레임  (0) 2020.01.29
리스트  (0) 2020.01.28
벡터  (0) 2020.01.28