Hodustory/프로그래밍&DB

[R programming 기초] R에서의 데이터관리2 - 배열(matrix, array, list)

호두밥 2019. 7. 10. 10:57

1차원 배열의 계산 (Vector 연산)

  • 1차원 배열
  • 각 배열은 vector로 지정하고 연산이 가능
  • 곱셈 %*%
  • 덧셈 +
  • 배열 합치기 cbind(), rbind()
  • 역배열, library(MASS)를 부른 후 ginv()
  • 전치배열(행렬 바꾸기) : t()

2차원 배열 (Matrix)

  • row와 column을 가지는 vector
    • 각 column은 같은 mode(숫자 또는 문자 등)의 데이터
    • 각 column내 수록된 항목의 갯수는 일정
    • 생성 시 미리 크기를 지정할 것(nrow=,ncol=)
  • 일반형 Matrix 만들기
    • mymatrix <- matrix(vector, nrow=r, ncol=c, byrow=FALSE, dimnames=list(char_vector_rownames, char_vector_colnames))
    • byrow = FALSE : matrix의 내용을 column우선으로 채움
    • byrow = TRUE : matrix의 내용을 row 우선으로 채움
    • dimnames : column 및 row에 대한 optional labels를 지정
> y <- matrix(1:20, nrow=5,ncol=4)
> y
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> rnames <- c("row1","row2")
> cnames <- c("col1","col2")
> mymatrix <- matrix(1:4, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames,cnames))
> mymatrix
     col1 col2
row1    1    2
row2    3    4

 

  • matrix의 row와 column에 함수 사용하기
    • apply() 함수
      • apply(m, dimcode, f, fargs)
        • m = matrix
        • dimcode = 1:row에 적용, 2: column에 적용
        • f = 적용할 함수, fargs = optional arg'ts
> mymatrix <-matrix(c(1:10), nrow=5,ncol=2)
> apply(mymatrix, 1, mean) #row의 평균값 구하기
[1] 3.5 4.5 5.5 6.5 7.5
> apply(mymatrix, 1:2, function(x) x/2) # 모든 항목을 2로 나누기
     [,1] [,2]
[1,]  0.5  3.0
[2,]  1.0  3.5
[3,]  1.5  4.0
[4,]  2.0  4.5
[5,]  2.5  5.0

2차원 이상 배열 (Array)

> myArray <- array(1:27, c(3,3,3))
> myArray
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

, , 3

     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

List

  • 관련 없는 데이터를 함께 모으고자 할 때 사용
  • 주로 함수나 각종 작업의 결과로서 반환되는 데이터의 형태
> a=c(1,2,3,4,5)
> b=c('가','나','다','라','마')
> c=c(TRUE, TRUE, TRUE, FALSE, FALSE)
> myList = list(a,b,c,1)

> myList
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "가" "나" "다" "라" "마"

[[3]]
[1]  TRUE  TRUE  TRUE FALSE FALSE

[[4]]
[1] 1
  • List에 항목 추가 및 삭제
> myList <- list(a='a',b='b',c='c')
> myList
$a
[1] "a"

$b
[1] "b"

$c
[1] "c"

> myList$d <- 'd' #항목 추가
> myList
$a
[1] "a"

$b
[1] "b"

$c
[1] "c"

$d
[1] "d"

> myList$d <- NULL #항목 삭제
> myList
$a
[1] "a"

$b
[1] "b"

$c
[1] "c"
  •  List에 함수 적용하기(lapply(), sapply())
> lapply(list(1:5, 10:15), median)  #결과가 List형태로 반환
[[1]]
[1] 3

[[2]]
[1] 12.5

> sapply(list(1:5, 10:15), median) #결과가 vector 또는 matrix 형태로 반환
[1]  3.0 12.5

Data Frame

column column마다 다른 데이터 형식의 항목을 가질 수 있음

> a <- c(1,2,3,4,5)
> b <- c('가','나','다','라','마')
> c <- c(TRUE,TRUE,TRUE,FALSE,FALSE)
> mydata <- data.frame(a,b,c)
> names(mydata) <- c('id','name','factor')
> mydata
  id name factor
1  1   가   TRUE
2  2   나   TRUE
3  3   다   TRUE
4  4   라  FALSE
5  5   마  FALSE
  • 기술적으로 데이터프레임은 list의 일종
    • 단 항목이 서로 같은 길이
  • 데이터 프레임의 결합(merge)
    • total <- merge(dataframeA, dataFrameB, by='id')
    • RDBMS의 join과 유사
  • 함수 적용
    • List와 마찬가지로 sapply(), lapply() 적용

Factor

  • 명목변수(nominal, categorical)일때 사용
  • factor() #참거짓, ordered() #순서 함수의 option을 이용해 문자와 순서 사이의 대응관계를 조절 
> rating <- c('large','medium','small')
> rating <- ordered(rating) #이 경우 rating 변수를 ordinal로 처리(1=large, 2=median, 3=small)
> rating
[1] large  medium small 
Levels: large < medium < small
  • factor에 함수 적용하기
    • tapply() 항목을 그룹별로 나눈 후 지정한 함수를 적용
    • split() 항목을 그룹별로 분리
> age <- c(15,26,34,45,56)
> group <- c('A','A','B','B','B')
> tapply(age, group, mean)
   A    B 
20.5 45.0 

> group <- c('a','b','b','a','b')
> split(1:5,group)
$a
[1] 1 4

$b
[1] 2 3 5

데이터셋의 정보 획득을 위한 함수

  • ls()  #objects 목록 출력
  • names(myData) #myData의 변수 목록 
  • str(myData) #myData의 구조 출력
  • levels(mydata$v1) #mydata의 v1의 level
  • dim(object) #object의 차원
  • class(object) #object의 데이터 형식 출력
  • head(mydata, n=10) #mydata의 상위 10개 row 출력
  • tail(mydata, n=10) #mydata의 하위 10개 row 출력
반응형