Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

To be a Data Scientist

#2 R 기초-1 본문

R 배우기

#2 R 기초-1

Daby 2016. 10. 4. 00:40

R 데이터 구조


R은 벡터, 요인, 행렬, 데이터 프레임, 리스트라는 데이터 구조를 지니고 있다. 





벡터(Vector) : 1차원으로 구성된 데이터 형태로, 동일한 타입의 데이터로만 구성되어야 한다. 


행렬 : 2차원 배열이며, 원소는 모두 동일한 유형의 데이터로 구성되어야 한다. matrix() 함수를 이용해 행렬을 생성할 수 있다. 

matrix(data, nrow=a, ncol=b, byrow=TRUE/FALSE, dimnames=list(row_name, col_name)


** nrow와 ncol은 행렬의 행과 열의 수를 나타낸다. 

**byrow는 데이터를 행 단위로 구성할지, 열 단위로 구성할지 결정하는 역할을 한다(TRUE : 행 단위/ FALSE : 열 단위). 기본적으로 FALSE로 셋팅되어 있다. 

**dimnames는 행렬의 행과 열의 이름을 정하고 싶을 때 사용한다. 

**혹은 rownames(행렬 이름)<-c(row_name), colnames(행렬 이름)<-c(col_name) 으로도 행과 열의 이름을 각각 설정할 수 있다. 



인덱싱하기


위의 xx 행렬에서 특정 행 또는 열을 인덱싱을 하기 위해서는 벡터와 마찬가지로 [ ]를 사용한다. xx[i,j]로 행렬의 원소를 지목한다. xx[2, ]를 입력하면 2행의 모든 원소가, xx[ ,2]를 입력하면 2열의 모든 원소가 나온다. 혹은 위와 같이 행과 열이 이름을 지정한 경우라면, 숫자 대신 이름을 입력해도 같은 결과가 나온다. xx["a","e"]와 xx[1,1]은 똑같이 1을 지목한다. 한편, 연속적인 열이나 행이 아닌, 부분적으로 지목하고 싶다면, c( )함수를 이용하면 된다. 

 

행렬 계산


rowSums( ) 행을 더한다

colSums( ) 열을 더하다

matrix/ scalar( 일정한 수) : 행렬의 각각의 원소를 scalar로 나눈다. (가감승제 모두 동일)

Matrix - Matrix : 같은 차원의 행렬을 서로 뺄 수 있다.  

벡터와 행렬의 차원이 맞지 않을 떄에는 R이 스스로 벡터의 차원을 행렬의 차원으로 늘려준다. 이떄 순서는 열 단위로 구성된다. 

즉, 2x3행렬 - c(1,2,3)의 경우, R은 스스로 벡터를 matrix(c(1,2,3), nrow=3, ncol=2)행렬로 바꾸어 계산한다. 

Matrix x Matrix : 기존의 행렬의 곱셈법과는 달리 각각의 원소들을 곱한다. 



요인 : 수준(level)로 이루어진 벡터. 1차원으로 구성되지만, 명목형과 서열형의 질적 데이터를 표시할 수 있다.

factor( ) 함수를 이용해, 주어진 숫자형 혹은 문자형 벡터를 요인으로 변환할 수 있다. 

factor(vector, order=TRUE, level=c( 지정하고 싶은 순서대로)) 


**level을 지정하지 않을 경우, 기본적으로 알파벳 순서를 따른다.

**order=TRUE는 따로 지정하지 않아도 무방하다. 하지만 대소비교를 해야 한다면, order=TRUE를 지정해야 한다. 

**따로 levels(요인 이름 ) 함수를 지정하거나, factor( ) 함수 안에 labels를 지정한다면, 요인에 이름을 정해줄 수 있다. 



str( ) 함수를 통해서, 몇가지 요인이 존재하는지 그리고 그 요인의 수준에 따라 기존의 벡터 상에서는 몇번 쨰에 존재했는 지 알 수 있다. 예를 들어 위의 fac.z를 str(fac,z)로 살펴보았을 때, Factor w/ 4 levels "A","B","C","D": 1 3 2 4 라는 결과가 도출될 것이다. 



리스트(list) : 가장  포괄적 형태의 구조로서 여러 유형, 여러 형태(심지어 리스트 자신도)의 데이터를 묶은 형태이다.

list( ) 함수를 사용할 경우, 각각의 구성 요소가 각각의 유형을 잃지 않는다. 아래의 예시를 보면, list( )와 c( )의 차이점을 명백히 볼 수 있다. 



str( ) 함수를 통해 리스트의 구조를 확인할 수 있다. 


리스트에서 데이터를 추출할 때, 대괄호를 사용한다. 그런데 이 때 대괄호가 하나( [ ]) 일 때와 두개( [[ ]] )일 경우 의미가 달라진다. 하나를 사용할 경우, 뽑아낸 데이터는 리스트인 반면(sub-list), 두개를 사용했을 때에는 리스트 안의 원소가 추출된다. 즉, 위의 예를 통해서 살펴보면 아래의 결과가 나옴을 알 수있다. 


동시에 대괄호 하나와 두개에 있어서 c( )함수의 의미가 달라진다. 즉, [ ] 안에 c(2,1)을 사용하 경우, 두번째와 첫번째의 sublist를 보여주지만, [[ ]] 안에 c{2,1)은 2번쨰 sublist의 첫번쨰 원소 즉, 190을 지칭한다. 이는 [[ ]] 자체가 하나의 원소를 뽑아내는 기능을 하기 때문이다. 또한 이름을 이용해서 데이터를 추출할 수도 있다. 즉, song[1]의 결과는 song["title"]과 song[[1]]의 결과는 song[["title"]]과 상응한다. 반면, FLASE와 TRUE를 사용해서 데이터를 추출하는 것은 오직 [ ] 에서만 가능하다. 


이외에도 list에서$를 사용할 수 있다. $은 리스트에서 대괄호 두개와 역활이 같다. 예를 들어, song$duration은 190을 지칭한다. 이는song[["duration"]]과 같은 결과이다. 이를 이용하여 리스트 내용을 추가할 수 있다.  song$sent<-c(13, 15, 16)를 입력하면, 리스트 아래에 sent라는 이름을 가진 4번째의 sublist가 생겼음을 확인할 수 있다. 이때, song$sent 대신 song[["sent"]]를 사용하여도 된다.  



데이터 프레임(data frame): 데이터 프레임은 행렬과 같이 2차원의 구조를 가지고 있으나 모든 데이터가 같은 유형일 필요가 

없다는 점에서 차이를 보인다. 열은 변수(variables)가 행은 각 개체(observations)가 된다는 점에서 일반적인 데이터 집합 (data set)과 동일해, 일반적으로 가장 많이 사용된다. 데이터 프레임은 종종 csv나 SQL 등의 형식의 파일을 불러와서 사용하는 경우가 많지만, data.frame( ) 함수를 사용해서 만들 수도 있다. 다만, 이때 같은 열에 있는 데이터들은 같은 유형이어야 하며, 모든 열의 길이가 같아야 한다.  

** data.frame( ) 함수 안에 옵션으로 stringsAsFactors=FALSE를 지정한다면, 자동으로 string을 factor(요인)으로 저장되는 R의 성질을 방지할 수 있다.

**.과 대문자, s의 유무에 주의하면서 입력해야 한다. 

**저장된 데이터 프레임에 행 벡터를 추가하고자 할 때에는 rbind( ) 함수를 이용한다. data.frame( ) 함수로 추가하고 싶은 행벡터를 만든후, rbind( )를 사용해 붙여넣어주면 된다. 열 벡터를 추가할때에는 cbind( ) 함수를 이용한다.  


인덱싱하기


사실상 행렬과 인덱싱하는 방법이 동일하며 리스트와도 비슷하다. 데이터 프레임은 같은 길이의 벡터를 모은 리스트의 한 종류이기 때문이다. [ ] 의 경우, 데이터 프레임의 형태가, [[ ]] 의 경우 하나의 원소(벡터나 행렬)가 나오고, [[ ]] 로는 두 개 이상의 원소를 지목하지 못한다. $를 이용해 열 벡터를 사용가능하다. 


정렬하기 

sort( ) 함수로 무분별하게 정렬되어 있는 데이터들을 오름차순으로 정렬할 수 있다. 즉, sort 함수 안에 데이터 프레임$열 벡터의 이름을 입력한다면, 열 벡터 내의 데이터들이 오름차순으로 정렬된다. order( ) 각각의 데이터가 오름차순 상으로 정리했을 때, 몇번째에 해당하는 데이터인지 즉 순위를 알 수 있다. 한편, order 함수 내에 decreasing=TRUE라는 옵션을 추가해 내림차순으로 정렬할 수도 있다. 

'R 배우기' 카테고리의 다른 글

#0. R로 시작하기  (0) 2016.09.14
#1. R 기초  (0) 2016.09.11
Comments