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