- 전체
- Sample DB
- database modeling
- [표준 SQL] Standard SQL
- G-SQL
- 10-Min
- ORACLE
- MS SQLserver
- MySQL
- SQLite
- postgreSQL
- 데이터아키텍처전문가 - 국가공인자격
- 데이터 분석 전문가 [ADP]
- [국가공인] SQL 개발자/전문가
- NoSQL
- hadoop
- hadoop eco system
- big data (빅데이터)
- stat(통계) R 언어
- XML DB & XQuery
- spark
- DataBase Tool
- 데이터분석 & 데이터사이언스
- Engineer Quality Management
- [기계학습] machine learning
- 데이터 수집 및 전처리
- 국가기술자격 빅데이터분석기사
- 암호화폐 (비트코인, cryptocurrency, bitcoin)
stat(통계) R 언어 R의 데이터 타입
2017.10.10 18:31
R의 데이터 타입
센트럴리밋 2016.12.28 02:23java에도 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"
$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 [아마추어 엔지니어 노트]
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 공지 | 오라클 기본 샘플 데이터베이스 | 졸리운_곰 | 2014.01.02 | 86167 |
| 공지 | [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE | 가을의 곰을... | 2013.02.10 | 78656 |
| 공지 | [G_SQL] Sample Database | 가을의 곰을... | 2012.05.20 | 95391 |
| 1 |
Programatically retrieving data from a website into a database
| 졸리운_곰 | 2017.05.30 | 9225 |

