프로그래밍/R 프로그래밍

03. R에서 사용되는 데이터 객체(Data Object) 다루기

산을좋아한라쯔 2015. 2. 15. 19:20
반응형

R은 데이터를 다루는 것이 핵심인 프로그램 언어이기에, C나 Java같은 일반 언어에 익숙한 프로그래머에게는 낯선 데이터 객체들이 기본으로 제공된다. 이 장에서는 이러한 낯선 데이터 객체들을 포함해서 R 프로그래밍을 위해서 꼭 알아야하는 객체들에 대해서 알아본다.

 

종류

R에서 제공하는 데이터 객체(Data Object)는 다음과 같다.

  • Scalar
  • Vector, Factor
  • Matrix, Array
  • Data Frame, List

데이터 객체는 모두 'mode'와 'length'라는 속성을 가진다.

mode는 어떤 종류의 데이터인가를 나타내는데, 4가지 mode가 있다.

  • numeric : 데이터의 종류가 숫자
  • logical: 참 혹은 거짓을 나타내는 논리형. TRUE, FALSE
  • character: 문자열
  • complex: 복소수 ex)1+2i

length는 데이터의 길이를 나타낸다.

 

각 데이터객체가 어떤 것인지 자세히 알아보기 전에, 간단히 데이터의 mode와 length에 대해서 R실습을 통해 알아보자.

 

mode와 length에 대한 실습

아래 내용을 R의 Script윈도우에 타이핑한다.

#ex1
a=3
mode(a)
length(a)

 

#ex2
b="student"
c=TRUE
d=1+2i

mode(b)
mode(c)
mode(d)

 

#ex1 이라고 되어 있는 줄은, 주석(comment)이다. R에서는 '#'로 시작되는 문자열은 명령어가 아닌 주석으로 처리된다.

첫번째 예제(ex1)를 보면 a라는 객체에 숫자 3을 할당하고, 이 때 a객체의 mode와 length가 얼마인지를 출력하는 예제이다.

 

여기서 a라는 객체에 3을 할당하는 과정을 보면, 일반 프로그램언어와 달리 객체를 선언하는 부분이 없이 바로 값을 할당할 수 있다는 데 주의(Visual Basic 같은 스크립트 언어도 역시 변수 선언없이 바로 값을 할당할 수 있다.

 

a에 숫자를 넣었으므로, a객체의 모드(타입)는 numeric으로 자동 설정될 것이고, length는 1이 될 것이다.

해당부분을 마우스로 드래그해서 -#ex1 ~ length(a)까지- 실행해 보자 (Ctrl-Enter 혹은 Ctrl-R)

> #ex1
> a=1
> mode(a)
[1] "numeric"
> length(a)
[1] 1

 

ex2를 보면, b, c, d에 각각 다른 모드의 값을 넣었다.

b에는 문자열, c에는 논리값 TRUE, d에는 복소수.

이렇게 하면, 각 객체의 mode는 자동으로 할당되는 값의 형태에 따라 알맞게 결정된다.

ex2부분을 선택해서 실행해보자.

> #ex2
> b="student"
> c=TRUE
> d=1+2i
> 
> mode(b)
[1] "character"
> mode(c)
[1] "logical"
> mode(d)
[1] "complex"

 

여기까지 실행했을 때, 생성된 객체들이 어떤 것이 있고, 현재 할당된 값들이 얼마인지를 왼쪽 아래편에 있는 창에서 확인할 수 있다.

 

 

 

이제 각 데이터 객체(Data Object)들에 대해 하나씩 자세히 알아본다.

 

1. Scalar(스칼라)

스칼라는 한 개의 값만을 가지는 객체를 말한다. (이에 반해 Vector는 여러개의 값을 가짐)

예를 들어 a = 3 이라고 입력했다면, a라는 스칼라객체가 생성되고, a에는 3이라는 한 개의 값이 들어가게 된다. 만약 다시 a= 5라고 했다면, a에는 3대신에 5로 값이 대체될 것이다.

 

스칼라 객체는, 일반 프로그래밍에서의 int, short, char 같은 변수와 똑 같아, 이해가 쉽기에 예제없이 그냥 넘어가자.

 

2. Vector, Factor

Vector(벡터)는 여러개의 값들이 모여있는 데이터객체이다. (Java에서의 Vector 클래스와 다르다)

예를 들어 x = c(3,5,2)라고 하면, x라는 벡터 객체가 생성되면서 이 객체에 숫자 3,5,2가 배열처럼 들어가게 된다.

여기서 c는 'concatenate'라는 의미를 가진 명령어로, Vector객체를 만들 때 사용된다.

x = c(3,5,2)

y = c("A","B","C")

 

mode(x); length(x);  #세미콜론으로 구분하면, 한 줄에 여러 명령을 넣을 수 있다.

mode(y); length(y);

 

y = c("A","B","C")이라고 하면 "A", "B" "C"라는 character값 3개를 가진 데이터객체 y가 생성된다.

 

x와 y의 모드(데이터 타입)와 길이는 어떻게 될까?

x는 숫자형데이터들이 들어갔으므로 numeric, y에는 문자열들이 들어갔으므로 character.

length는 둘 다 3이 될 것이다.

> mode(x); length(x);  #세미콜론으로 구분하면, 한 줄에 여러 명령을 넣을 수 있다.
[1] "numeric"
[1] 3
> mode(y); length(y);
[1] "character"
[1] 3

 

Vector 객체에는 서로 다른 모드의 값들이 들어갈 수 있을까?

예를 들어 z = c(3,5,"A")라고 입력하면 어떻게 될까?

z = c(3,5,"A")
mode(z)

답은 "Vector객체에는 같은 모드의 값만 들어갈 수 있다"이다.

위와 같이 z에 numeric과 character 값을 넣었을 때, z는 character모드가 된다. 즉, 3,5가 자동 형변환되어 character로 인식되어 입력된다.

x,y,z에 값이 들어가 있는 것을 보면 다음과 같다.

 

 

벡터 객체에 있는 각 값들에 대해 어떻게 읽고 값을 넣을까?

원소의 번호를 통해 접근 가능하다.

예를 들어, 위의 x객체에서 첫번째 값은 x[1], 두번째 값은 x[2]이다.  (원소번호가 0이 아닌 1로 시작함에 유의)

 

벡터객체의 접근에는 원소번호(인덱스)뿐 아니라 '이름'에 의해서도 접근이 가능하다. 즉, 벡터의 각 원소에는 '이름'을 부여할 수 있는데, names라는 명령을 이용해서 가능하다.

위 예제에서 x객체의 원소에 대해서 이름을 부여해보자.

names(x) = c("First","Second","Third")
x["First"]

위와같이 하면, x["First"]의 값으로 3이 출력될 것이다.

 

하나의 벡터 객체에서 하위벡터(sub vector)객체를 만들 수 있다.

y1=y[1]
y2=y[2:3]
y3=y[c(1,3)]

위와 같이 했을 때, y1 y2 y3는 어떤 객체이며 어떤 값이 들어가게 될까?

 

 y1은 y의 첫번째 값인 "A"라는 문자열을 갖는 스칼라객체가 되겠고,

y2는 y의 2번째부터 3번째가지의 값을 가진 벡터 객체,

y3은 y의 1번, 3번째 값인 "A", "C"를 가지는 벡터 객체가 생성되겠다.

 

여기서 n1:n2처럼, 콜론으로 구성된 숫자의 의미는, n1에서 n2까지의 연속된 숫자로 구성된 벡터를 의미하는 것으로, R에서 데이터를 입력할 때 자주 쓰이는 표현이다.

또한 y의 첫번째와 3번째 데이터를 나타낼 때, y[c(1,3)]이라고 표현한 것도 자주 사용되는 표현이니 익숙해져야 하겠다.

 

지금까지 Vector에 대해서 알아봤는데, 핵심되는 사항을 다시한번 정리하면 다음과 같다.

 

  • Vector의 원소는 동질적이다. -> 같은 mode의 원소로 구성
  • Vector의 원소는 위치 인덱스에 의해 접근 가능 -> 1로 시작. 이름을 부여하면 이름으로도 접근 가능
  • Vector의 원소 여러개를 인덱싱해서, 다른 하위벡터를 만들 수 있다.  

 

 

 

Factor(팩터, 요인)

Factor는 열거형(범주형) 값들로 이루어진 데이터객체이다. 즉, 원소들이 가지는 값이 숫자나 문자열이 아니고, 약속된 범주를 가르키는 값들이다.(Vector와 다른 점은, 원소들이 범주형이라는 점)

 

예를 들어 c = factor(c("A","C"), levels=c("A","B","C")) 라고 한 경우, c는 팩터형 객체가 되는데, "A" "B" "C"라는 범주를 가지면서, 원소는 "A"라는 범주와 "C"라는 범주 하나가 존재하게 된다. (학생들이 원소이고 각 학생들에 대해서 A, B, C 세 등급의 학점이 부여된 데이터 셋을 생각하면 되겠다)

c = factor(c("A","C"), levels=c("A","B","C"))

 

만약 아래와 같은 코드가 있을 때, 결과는 어떻게 될까?

a = c(5,3,2)
b = as.factor(a)

 

a
b

 

a[1]+a[2]
b[1]+b[2]

결과는 다음과 같다.

> a = c(5,3,2)
> b = as.factor(a)
> 
> a
[1] 5 3 2
> b
[1] 5 3 2
Levels: 2 3 5
> 
> a[1]+a[2]
[1] 8
> b[1]+b[2]
[1] NA
Warning message:
In Ops.factor(b[1], b[2]) : + not meaningful for factors

 

a는 5,3,2가 들어가게 되므로 numeric원소를 가진 Vector다.

b는 as.factor라는 함수에 의해서 Vector인 a가 Factor형으로 바뀐 객체이다. (as.factor와 마찬가지로 as.vector 함수가 있다)

따라서, b에 들어 있는 5,3,2라는 원소는 숫자 5,3,2가 아니라, '5' '3' '2'라는 이름의 열거형 값이다. (수, 우, 미, 양, 가 처럼)

그러므로 b[1]+b[2] 처럼 산술연산을 할 수 없다.

 

3. Matrix, Array

Matrix(행렬)와 Array(배열)은 차원을 가지는 Vector이다.

  • matrix: 행 벡터와 열 벡터로 이루어 진다. 2차원
  • array: matrix가 2차원인데 반해 array는 더 높은 차원까지 표현 가능

행렬 객체의 생성은 matrix라는 명령어에 의해 가능하다.

 

<matrix 명령 사용법>

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

 

여러가지 행렬을 만들어 보자.

# 1값을 가지는 2x2 행렬
a = matrix(0,2,2)

 

# 1~6까지 값을 가지는 3x2 행렬
b = matrix(1:6,3,2)

 

# 1~6까지 값을 행우선으로 값이 부여되는 3x2행렬
c = matrix(1:6,3,2,byrow=TRUE)

 

만들어진 행렬객체의 값을 확인하려면, 왼쪽 아래 윈도우에서 객체의 이름을 마우스로 클릭해보자. 그러면, 행렬의 값이 그리드형태로 보일 것이다.

 

 

 

 

Array(배열)

2차원이상의 배열객체는 dim이라는 명령어를 통해서 만들 수 있다. (matrix도 dim을 통해 만들 수 있다)

x = 1:12; dim(x) = c(3,4)
x

 

y = 1:12; dim(y) = c(2,3,2)
y

 

실행결과는 다음과 같다.

> x = 1:12; dim(x) = c(3,4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> 
> y = 1:12; dim(y) = c(2,3,2)
> y
, , 1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
, , 2
     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

x는 3 x 2 행렬이 되었다.

 

y는 2 x 3 x 2의 다차원 행렬(=Array)로 되었음을 알 수 있다.

 

 

4. Data Frame, List

데이터 프레임(Data Frame)은 R에서 많이 사용되는 데이터 객체로, 엑셀처럼 행과 열이 있는 테이블(사각형)로 된 데이터 구조이다.

(행과 열이 있다는 것으로만 봐서는 Matrix객체와 같지만, Matrix보다 더 많은 정보를 - 행이름, 칼럼명 등 - 가지고 있다.)

 

데이터 프레임을 만드는 명령어는 data.frame이다. 이 명령어의 인자로, 칼럼 데이터가 될 Vector객체들을 지정해 주면 된다.

다음 코드를 타이핑하고 실행해 보자

a = c(1,2,3); b = c("A","B","C")
c = data.frame(a,b)

c[[1]]
c[[2]]
c[1,2]
c$b[2]

c = data.frame(a,b,stringsAsFactors=FALSE)
c[[1]]
c[[2]]
c[1,2]
c$b[2]

 

ㅇㅇ

 

반응형

'프로그래밍 > R 프로그래밍' 카테고리의 다른 글

02. R 프로그래밍 맛보기  (0) 2015.02.15
01. R Studio 설치  (0) 2015.02.14