stat(통계) R 언어 R의 데이터 타입

2017.10.10 18:31

졸리운_곰 조회 수:1644

 

R의 데이터 타입

센트럴리밋 2016.12.28 02:23

 java에도 primitive data type 이 있듯, R 에도 데이터를 다양한 필요에 따라 binary data를 encode, decode하기 위한 여러 데이터 타입이 있다. 이번 포스트에서는 그러한 데이터 타입에 대해서 적어보도록 하겠다. 이는 « R을 활용한 기계 학습 » - 브렌트 란츠, 책의 내용을 참고한 것이다.

 

 

R 의 기본 데이터 타입은

integer / numeric / character / logical 이 있다. 그리고 이들의 aggregate 데이터 타입들은 다음과 같은 타입들이 있다.

 

1. Vector: 

 

ordered set이며, set 을 구성하는 기본 data type들은 모두 같아야 한다. 

     c()라는 combine 함수를 통해 vector를 만들 수 있다. 이 떄에는 지정 연산자  <-  를 사용한다.

   (   java와 다르게 R은  변수 선언 시 identifier 앞에 데이터 타입을 표시할 필요가 없다! c() 내부에서도 마찬가지!)

 

> student_name_vector <- c("Nayeon","Tzyu","Dahyun")

 

이렇게 선언을 했다면, 

 

> student_name_vector[1] 

[1] "Nayeon" 

 

라는 결과가 출력된다.

 

 

> student_name

 

[1] "Nayeon" "Tzyu"   "Dahyun"

 

 

(이 때 st만 치고 탭을 쳐도 자동완성 기능이 있기 떄문에 중복되는 변수 이름이 없으면 자동으로 완성된다.!)

 

벡터의 특정한 여러 element를 serial 하게 출력하려면 다음과 같이 입력한다.

> student_name[1:3]

[1] "Nayeon" "Tzyu"   "Dahyun"

 

벡터의 특정한 여러 element를 non-serial하게 출력하려면, 다음과 같이 입력한다.

 

> student_name[c(TRUE,FALSE,TRUE)]

[1] "Nayeon" "Dahyun"

 

(이 때 FALSE, TRUE 등은 case sensitive 하다! )

 

 

2. Factor

 

실제 세계의 데이터에는 연속적이지도 않고, 값 사이의 대소 비교가 불분명한 특정한 category들의 데이터가 존재한다.

그것들을 메모리 측면에서 효율적으로 사용하기 위해 factor 라는 데이터 타입을 사용한다.

아마 나와 같이 자바에 익숙한 사람들은, 처음에 이 컨셉이 생소하게 느껴질지도 모른다. 

하지만, 일단은 어떤 특정 범주들 값을 갖는 데이터에 대해서 매우 유용한 데이터 타입이라고 알아두도록 하자.

 

> Bloodtype <- factor(c("B","O","AB")

 

> Bloodtype

[1] B  O  AB

Levels: AB B O

 

> Bloodtype[1]

[1] B

Levels: AB B O

 

여기서 level은, 우리가 허용하기로 한 category들의 목록이이고. c() 는 실제로 우리가 입력할 데이터이다.

그런데 만약 입력하는 데이터에 모든 category가 포함되지 않을 떄에는 어떻게 해야할까?

즉 위의 경우처럼 데이터에 A형이 없었기 때문에, level에 A가 없는 것과 같은 오류가 발생한다.

그 때에는 변수에 데이터 값을 넣을 때에 직접 추가를 해주면된다. 

(이 때 levels를  = 를 사용해, 선언하는 문법에 유의하도록하자! syntax에러는 뜨지 않으면서 NA값이 입력된다..)

 

> cc <- factor(c("B","O") , levels= c("B","O","A","AB"))

 

> cc

[1] B O

Levels: B O A AB

 

 

 

3. 리스트

      Vector와 거의 똑같지만, 원소들의 데이터 타입이 모두 같지 않아도 된다. 그리고 이 때에는, 각 원소들이 의미를 갖는 이름을 갖게 된다.

java에서 클래스를 만들 때, 멤버 변수들의 데이터 타입이 모두 달라도 되고 동시에 멤버변수의 Identifier가 있었던 것을 떠올리자!

이에 대비해, vector는 array 와 유사하다. 어레이의 각 원소는, ID를 갖지 않아도 되며 모든 원소의 데이터 타입이 같다.

 

( 만약, R에서 vector에 서로 다른 타입을 넣으려 시도하면, 자동으로

character드로 바꾸어준다.

> student_name <- c("Tzyu", 32)

> student_name

 

  [1] "Tzyu" "32"

)

이 떄에는, vector에서 combine 함수를 대신에 list()를 사용한다.

> student <- list( name = "Tzyu", age = 20)

> student

$name

[1] "Tzyu"

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

$age

[1] 20

과 같이 되며, 개별적인 원소의 접근은

 

> student$name

 

[1] "Tzyu"

 

과 같이 이루어질 수 있다.

 

3. 데이터 프레임

데이터 프레임은 테이블과 같이 2차원 구조를 갖는 데이터 타입이다. 데이터 프레임은, 벡터 혹은 팩터의 리스트로,

데이터 베이스의 한 테이블을 표현한다.

즉 다시 말해,  데이터프레임은,  vecotr들의 (column vector) 리스트라고 생각하면된다. 왜 컬럼 벡터(혹은 팩터) 일까? 더 유연하고 좋은

리스트가 아니라? 왜냐하면 여기서 column vector 는 어떤 attribute에 대한 record의 값이기 때문에, 모두 같은 타입을 공유하기 떄문이다.

그러면 왜 벡터들의 리스트일까? 벡터의 벡터가 아니라? 그 이유는 이유는 벡터들의 타입이 다를 필요가 없기 떄문이다. 예로  어떤 테이블의 attribute들이 name, age이면 name 과 age의 데이터 타입이 같을 필요는 없다. 예를 보도록 하자.

 

 

> student_data  <- data.frame( student_name_vector , student_age_vecotor ,student_gender_factor, stringsAsFactors = FALSE )

> student_data

  student_name_vector student_age_vecotor student_gender_factor

1              Nayeon                  20                     F

2                Tzyu                  21                     F

3              Dahyun                  20                     F

만약, 특정 coiumn vector 만을 보고 싶다면,  

 

> student_data[c("student_name_vector", "student_gender_factor")]

> student_name_vector student_gender_factor

1              Nayeon                    F

2                Tzyu                     F

 

3              Dahyun                    F

 

과 같이 할 수 있다.

첫번째 컬럼 벡터를 표현하고 싶을 때는, 

> student_data[1]

  student_name_vector

1              Nayeon

2                Tzyu

 

3              Dahyun

 

과 같이하고 ,

각 첫번째 행에 대해 모든 열의 데이터를 보고 싶다면

> student_data[1, ]

  student_name_vector student_age_vecotor student_gender_factor

 

1              Nayeon                  20                     F

 

과 같이 하면된다.

또한 표시하고 싶은 행벡터와 열벡터를 non-serial하게 표현할수도 있다.

> student_data[c(1,2), c("student_name_vector", "student_gender_factor"

+ )]

  student_name_vector student_gender_factor

1              Nayeon                     F

 

2                Tzyu                     F

 

 

4. 매트릭스와 어레이

매트릭스와 어레이는, 데이터 프레임과 같이 2차원 데이터를 나타내는 aggregate type 이지만,  데이타프레임과 달리 column vector들의 vector이다. 아까전의 설명을 온전히 이해했다면, matrix가 갖는 다음의 의미가 더 명확히 와닿을 것이다. 즉, 모든 elemnt 의 data type이 같다. 

그렇기 떄문에, 각 column vecotr들의 이름이 필요가 없다. 동시에 column의 수 혹은 row의 수만을 지정함으로써, 매트릭스의 dimension을 define할 수 있다.

 

> m <- matrix(c(1,2,3,4,5,6), nrow = 6 )

> m

     [,1]

[1,]    1

[2,]    2

[3,]    3

[4,]    4

[5,]    5

[6,]    6

> m <- matrix(c(1,2,3,4,5,6), nrow = 3 )

> m

     [,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

> m <- matrix(c(1,2,3,4,5,6), ncol = 3 )

> m

     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6

> m <- matrix(c(1,2,3,4,5,6), ncol = 6 )

> m

     [,1] [,2] [,3] [,4] [,5] [,6]

[1,]    1    2    3    4    5    6

 

이것만 제외하면 저장된 데이터를 다시 retrieve하는 것은 데이터 프레임을 사용할 때와 동일하다.

 



출처: http://superelement.tistory.com/6 [아마추어 엔지니어 노트]

출처: http://superelement.tistory.com/6 [아마추어 엔지니어 노트]

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED