본문 바로가기
Programming/R

[R #2] 데이터의 유형과 구조

by shiny_sneakers 2020. 5. 24.

1. Vector

 - 특징

 : 1차원의 선형 자료구조.

 : 변수[index]로 참조 가능. index는 1부터 시작.

 : 동일한 자료형만 저장 가능.

 

- 백터 객체 생성

 : 'c()' - 조합, 'seq()' - 수열, 'rep()' - 반복/복제의 함수를 이용하여 생성이 가능하다.

v_num <- c(23, 2:4)
v_char <- c("hoh","kai","moe")
v_log <- c(T,TRUE,FALSE,F)
v_num; v_char; v_log // c++과 같이 세미콜론을 쓰면 한 줄에 여러 statement 작성 가능
// [1] 23  2  3  4
// [1] "hoh" "kai" "moe"
// [1]  TRUE  TRUE FALSE FALSE

v_seq <- seq(1,20,3) // seq(<시작>,<끝>,<가중치>)
v_seq	//[1]  1  4  7 10 13 16 19

v_rep <- rep(1:4,2)
v_rep	//[1] 1 2 3 4 1 2 3 4

- 백터 자료 처리

 : 'union()' - 합집합, 'setdiff()' - 차집합, 'intersect()' - 교집합의 함수를 이용하여 벡터 자료 처리가 가능하다.

x <- c(1,3,5,7)
y <- c(3,5,9)
union(x,y)	//[1] 1 3 5 7 9
setdiff(x,y)	//[1] 1 7
intersect(x,y)	//[1] 3 5

 

> 자료 처리 우선순위

 : 벡터 변수 하나에는 모두 같은 자료형이 들어와야 한다. 숫자, 문자, 논리형 자료들이 같이 있을 때 처리 우선순위를 확인해봤다.

//아까 쓴 v_num, v_char, v_log 변수를 사용했다.
c(v_num,v_char)	//[1] "23"  "2"   "3"   "4"   "hoh" "kai" "moe"
// - [숫자] < [문자]
c(v_num,v_log)	//[1] 23  2  3  4  1  1  0  0
// - [숫자] > [논리] (TRUE는 1, FALSE는 0으로 바뀜)
c(v_log,v_char)	//[1] "TRUE"  "TRUE"  "FALSE" "FALSE" "hoh"   "kai"   "moe"
// - [논리] < [문자] 
c(v_num,v_char,v_log)
//[10] "23"    "2"     "3"     "4"     "hoh"   "kai"   "moe"   "TRUE"  "TRUE" "FALSE" "FALSE"

확인한 결과 문자>숫자>논리 순으로 변환이 된다는 것을 알 수 있었다.(숫자-논리간에는 TRUE가 1, FALSE가 0이 된다.)

 

> 칼럼(열)명 지정 : 'names()'함수를 이용하여 벡터 데이터에 칼럼명을 지정할 수 있다. 

age <- c(30,35,40)
names(age) <- c("kim","Ryu","Lee")
age	/*
kim Ryu Lee
 30  35  40*/

 

> 벡터 원소 접근 : 'vec[index]' 형식으로 벡터 원소에 접근할 수 있다. 용례는 다음과 같다.

a <- c(1:10)

a[4:8]	//[1] 4 5 6 7 8

a[2:length(a)-1]	//[1] 1 2 3 4 5 6 7 8 9
a[2:(length(a)-1)]	//[1] 2 3 4 5 6 7 8 9

a[1,2]		//Error in a[1, 2] : incorrect number of dimensions
a[c(1,2)]	//[1] 1 2

a[-2]		//[1]  1  3  4  5  6  7  8  9 10
a[-c(2:7)]	//[1]  1  8  9 10

 여기서 새로 알게 된 점은 '2:length(a)-1'은 2:length(a)의 모든 원소에 -1 연산을 수행한다는 것이다. 따라서 의도에 맞게 쓰려면 괄호'()'를 써서 명확하게 표현할 필요가 있다고 생각한다.

 

 벡터의 원소를 추출하기 위해서는 index를 항상 벡터형으로 입력해야 한다. a[1,2]는 2차원 자료구조에서 좌표를 통해 원소를 추출하는 방법이며 절대 첫 번째, 두 번째 원소를 추출한다는 의미가 아니다. 앞의 예시와 같이 index값을 c(1,2)로 해야만 의도한 대로 추출이 될 수 있다.

 

 '-'를 통해 여집합으로 값을 추출할 수도 있다.

 

2. Matrix

 - 특징

 : 2차원 배열형(행렬)의 자료구조.

 : 동일한 자료형만 저장 가능.

 

- Matrix 객체 생성

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

data - 행렬 객체의 대상 자료

nrow/ncol - 행/열의 수 지정

byrow - 행 우선순위 여부 지정

dimnames - 차원 이름 지정

 * 위의 형식에서 등호('=') 다음의 값들은 default 값들이다.

 * ("byrow = FALSE"의 의미는 행이 아닌 열을 우선으로 데이터를 채운다는 뜻이다.)

 : 행 순서로 데이터를 채우고자 할 때는 'byrow=T' 속성을 추가하면 된다

- 묶음으로 Matrix 객체 생성

 : 'rbind()'-행 묶음, 'cbind'-열 묶음 함수를 이용하여 벡터 또는 행렬 값을 묶을 수 있다. 이때 묶고자 하는 행or열의 수가 같아야 한다. (rbind-열의 수, cbind-행의 수)

 

 

rbind/cbind 함수의 인자 중 벡터가 포함된 경우에는 행/열의 수가 맞지 않아도 결과가 나오지만 matrix간 조합에는 조건을 만족시켜야만 결과가 나온다.

 

- 행렬 객체 자료 처리

 아래와 같은 방법으로 행렬의 데이터를 추출할 수 있다.

> length(), nrow(), ncol() 함수 : 각각 원소의 개수, 행의 수, 열의 수를 반환한다.

> apply() 함수 : 행렬에 함수를 적용하여 자료를 처리하는데 이용하는 함수.

 형식 : 'apply(X, MARGIN, FUN, ....)'

 X - 함수를 적용할 행렬 객체

 MARGIN - 함수 적용 단위 설정(1=행, 2=열)

 FUN - 행렬에 적용할 함수(sum,mean,사용자 정의 함수 등)

행렬 x에 custom_func을 직접 적용하면 [3*3]행렬과 [3*1]행렬(matrix(c(1,2,3)의 결과)의 곱(열 단위 연산)으로 나타내지지만 apply 함수를 이용하면 행 단위로 연산을 할 수 있다.

 

> 행렬에 칼럼명 지정 : 'colnames()' 함수를 이용하여 칼럼명을 지정할 수 있다.

 

3. Array

- 특징

 : 차원 배열형 자료구조.

 : 상대적으로 활용도가 낮다.

 * 'str()' 함수(structure)를 통해 차원의 수와 차원명 등을 알 수 있다.+

 

4. List

- 특징

 : 하나의 메모리에 key와 value가 한 쌍으로 저장된다.

 : key를 통해 value를 불러올 수 있으며, value값으로는 vector,matrix,array,list 등의 대부분의 R 자료구조 객체가 저장될 수 있다.

 : 함수 내에서 여러 값을 하나의 키로 묶어서 반환하는 경우에 유용하다.

 

- 1차원 List 객체 생성 

 [[n]] - key, [n] - value에 해당한다. 위에 코드에서는 키값을 따로 지정하지 않은 경우이다.

 아래와 같이 list(<key1>=<value1>, ... ,<key#>=<value#>)의 형식으로 list 객체를 생성할 수 있다.

<listname>$<key>의 형식으로 자료에 접근할 수 있다.

 

> unlist() : 자료 처리를 편리하게 하기 위해 리스트를 벡터로 변환하여 사용할 수 있게 해 준다.

 

- List 객체 자료 처리 함수

 

> 'lapply()'-연산 결과를 list형태로 반환, 'sapply()'-연산 결과를 vector형태로 반환

- 다차원 List 객체 생성

 : list의 원소의 value가 list객체로 중첩된 구조를 다차원(중첩) 리스트라고 한다.

위와 같이 다차원 리스트를 do.call() 함수를 통해 리스트를 각각 분해한 후 지정된 함수를 적용하여 효과적으로 처리할 수 있다.

5. Data Frame

- 특징

 : R에서 가장 많이 사용하는 자료구조.

 : 칼럼 단위로 서로 다른 데이터의 저장이 가능하다.

 : 리스트와 벡터의 혼합형으로 칼럼은 리스트, 칼럼 내 데이터는 벡터 자료구조를 갖는다.

 

- data.frame 객체 생성

 형식 : data.frame(<col1>=<data1>,...,<col#>=<data#>) * 칼럼의 data길이가 같지 않으면 Error 발생

read.table(), read.csv() 함수를 통해서도 dataframe을 생성할 수 있다. 이와 관련된 내용은 다음 chapter인 데이터 입출력에서 상세히 다루는 것 같다.

 

- data.frame 객체 참조

 : <변수명>$<칼럼명>형식으로 데이터 참조가 가능하며, 벡터 형식으로 반환된다.

- data.frame 객체 자료 처리 함수

> str() : 데이터프레임 구조를 보여주는 함수.

> summary() : 데이터 통계량(Min,Max,Median,Mean,1Q,3Q)을 요약하여 보여주는 함수.

> matrix에서와 비슷하게 apply 함수를 이용한 자료 처리가 가능하다.

> subset() : 데이터프레임의 부분 객체를 만드는 함수.

 형식 : subset(<df 객체>,<조건>). 논리 연산자(AND(&)/OR(|))를 통한 표현이 가능하다.

> merge() : 다수의 데이터프레임을 병합하는 함수.

 형식 : merge(<x>,<y>,by.x='<x의 열>',by.y='<y의 열>').

* ?merge를 통해 documentation을 보면 인수들과 옵션이 더 많다.

* by.x의 값과 by.y의 값들 중 둘 모두에게 있는 행만 merge가 된다.

6. 문자열 처리

- strimgr 패키지 : 문자열 연산에 필요한 다양한 함수를 제공해준다.

 str_length() : 문자열 길이 반환 / str_c() : 문자열 결합 / str_sub()  : 부분 문자열 생성

/ str_split() : 구분자 기준으로 문자열 분리 / str_replace() : 문자열 교체 / str_extract[_all]() : 특정 패턴의 문자열 추출

/ str_locate[_all]() : 특정 패턴의 문자열 위치 찾기

 

> str_extract 함수

 형식 : str_extract(<문자열>,<정규표현식>)

정규표현식 "[0-9]{2}"를 해석하면 숫자([0-9])연속 2회{2}로 나타난 문자열 패턴을 의미한다.

* digit의 의미로 '\\d'를 사용할 수도 있다.

 

비슷한 방법으로 알파벳은[A-z], 한글은[가-힣]으로 이용할 수 있다.

* 알파벳이 대문자 A부터 소문자 z까지인 이유는 ASCII 코드상에서 대문자 A값(65)부터 시작해서인것 같다.

'^'기호를 통해 특정 문자열을 제외한 패턴을 뽑을 수도 있다.

'\\w'는 특수문자를 포함하지 않은 한글,영문자,숫자를 의미한다.

> paste 함수 : 문자열 벡터 객체의 원소를 구분자를 적용하여 하나의 문자열로 합치는 함수.

* data set이 방대할 때 효율적인 처리를 위해 이용한다.

> 그 외의 함수 용례

 

Chapter 2. 데이터의 유형과 구조 끝.

 

- Reference

 김진성, 빅데이터 분석을 위한 R프로그래밍, 가메출판사(2018), p58-90.

'Programming > R' 카테고리의 다른 글

[R #6] 데이터 조작  (0) 2020.06.11
[R #5] 데이터 시각화  (0) 2020.06.06
[R #4] 제어문과 함수  (0) 2020.06.03
[R #3] 데이터 입출력  (0) 2020.05.27
[R #1] R 개요  (0) 2020.05.21

댓글