프로그래밍언어/R programing

R 프로그래밍 스터디 3일차

알 수 없는 사용자 2015. 5. 13. 01:03

배열, 리스트, 데이터 프레임

 

리스트 [ list() ]

*벡터와 행렬 등 여러 데이터를 모아서 하나의 오브젝트로 만든 것.

 

x <- list( 1:5, "welcome" , c(1,4,2) )

list의 기본 형태

z <- list( 1:5,  list("welcome", c( 1,2,3 ) ) )

list안에 list추가 가능

z[[3]] <- list( “ Who I Am?”  )

요소 추가

z[[3]] <- NULL

요소 제거

z <- list()  or <- as.list(NULL)

리스트 초기화

{ c or append }(list( 1:4 ), list( c( T,T,T ) ) )

리스트끼리 서로 연결

 

배열 [ array() ]

*자료의 유형이 동일한 데이터의 원소들로 구성된 2차원 이상의 구조를 갖는 자료 객체

 

A <- 1:20

dim(A) <- c(4:5);A           # 2차원 4 5

 

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

[1,]    1    5    9   13   17

[2,]    2    6   10   14   18

[3,]    3    7   11   15   19

[4,]    4    8   12   16   20

 

A[2,4]

[1]14

 

A <- array(1:20, dim=c(4:5))     # array() 함수 사용

 

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

[1,]    1    5    9   13   17

[2,]    2    6   10   14   18

[3,]    3    7   11   15   19

[4,]    4    8   12   16   20

 

A[1:2]             # 배열 요소 추출

[1] 5             # 다차원 배열 추출: x[, , 3차원째의 요소, …]

B <- A

A*B

A + B

A * 5      # 배열로 배열끼리 사칙연산 가능, 특정 수와 연산 가능.

 

B <- t(A)          # 행과 열을 바꾸는 함수 t()

 

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

[1,]    1    2    3    4

[2,]    5    6    7    8

[3,]    9   10   11   12

[4,]   13   14   15   16

[5,]   17   18   19   20

 

diag(a)              # 대각행렬 구하기

 

[1] 1 6 11 16

 

A <- array(1:16, dim= c(4:4) );A

 

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

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

 

A %*% A          # 행렬의 곱

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

[1,]   90  202  314  426

[2,]  100  228  356  484

[3,]  110  254  398  542

[4,]  120  280  440  600

 

 

 

데이터 프레임 [ data.frame() ]

*겉보기엔 행렬과 같은 2차원 배열이지만, 데이터 프레임의 각 행과 열은 반드시 라벨을 가지며 라벨에 의한 조작이 가능한 점이 보통의 배열과 다르다.

* 형이 다른 데이터를 모아서 하나의 변수로 다룰 수 있다.

ID

성별

신장

열명(변수명)

1

F

160

측정값(1)

2

F

165

측정값(2)

3

M

177

측정값(3)

*데이터 프레임의 각 행은 하나의 측정값으로, 각 열은 하나의 변수명(항목)으로 인식된다.

*각 열의 요소의 형은 제각각 이어도 상관없다. – 통계분석에 용이

>data.frame(열명1 = 벡터1, 열명2 = 벡터2, …)  

 

(1)벡터로부터 데이터 프레임 작성

>id <- c(1,2,3,4,5)

> sex <- c( “F” , ”M” , ”M” , ”F”, “F” )

> height <- c(160, 165, 170, 155,166)

> mydata <- data.frame(ID=id, Gender= sex , Height = height); mydata

> ID Gender Height

1  1      F    160

2  2      M    165

3  3      F    170

4  4      M    155

5  5      M    166

이미지로 나타내면 다음과 같다.

               

(2) 행렬로 데이터 프레임 작성

>x<- matrix(c(1,1,160,50,

+           2,1,165,65,

+           3,2,170,60,

+           4,2,175,55,

+           5,2,160,70),nrow=5,byrow=T)  # 5 , 행부터 데이터 입력

>mydata <- data.frame(x)

>names(mydata) <- c(“ID”, “Gender”, “Height”, “Weight”)

>mydata

 ID Gender Height weight

1  1      F    160     50

2  2      1    165     65

3  3      2    170     60

4  4      2    175     55

5  5      2    160     70

 

 

1)데이터에 액세스하는 방법

함수

기능

head(mydata, n=a)

앞에서부터 a행만큼 추출

tail(mydata, n=b)

뒤에서부터 b행만큼 추출

mydata$Gender

지정한 열(Gender)을 표시

mydata[“Gender”]

mydata[[“Gender”]]

mydata[2]

두 번쨰 열을 표시

mydata[[2]]

mydata[3,2]

3 2열의 데이터를 표시

mydata[[3,2]]

mydata[3,”열 이름”]

지정한 열의 세 번째 행의 데이터를 표시

mydata[[3, “열 이름”]]

mydata[ c(1,2) ]

1열과 2열의 데이터를 표시

mydata[ ,c(TFT)]

논리 벡터 c(T,F,T) TRUE로 된 열을 표시

mydata[mydata$Gender==”F”]

변수 Gender F인 행을 표시

mydata[mydata$Gender==”F”&

mydata$Height>160]

변수 Gender F이고 변수 Height 160보다 큰 행을 표시

mydata[sapply(mydata,is.numeric)

수치 데이터만 표시

subset(mydata$Gender==”F”)

변수 Gender F인 행을 표시

subset(mydata,Gender==”F”,c(ID,Gender))

변수 ID Gender에 대해 변수 Gender F인 행을 표시

mydata[ c(3,4) , ]

3행과 4행의 데이터를 표시

 

 

 

*데이터 프레임의 부분적 내용을 알고 싶을 때 head() 사용

> id <- c(1,2,3,4,5)

> sex <- c( “F” , ”M” , ”M" , "F" , " F ")

> height <- c(160, 165, 170, 155, 166)

> mydata <- data.frame(ID=id, Gender= sex , Height = height)

> mydata

  ID Gender Height

1  1      F    160

2  2      M    165

3  3      F    170

4  4      M    155

5  5      M    166

------------------------------------------------------------------------------

>head(mydata, n=2)   # mydata의 처음부터 2행을 표시

 

ID Gender Height weight

1  1      F    160     50

2  2      1    165     65

*데이터 프레임의 일부 변수만 확인할 때 subset() 사용

>subset(mydata, height > 160) # 변수 Height 160보다 큰 행 표시

 

ID Gender Height weight

3  3      2    170     60

5  5      2    160     70

 

Mydata[ , c(1,2)] 1열과 2열의 데이터를 표시, mydata[ , c(-1,-2)] 1열과 2열 이외의 데이터를 표시할 수 있다.

>mydata[ , c(-1,-2)

 

Height weight

1    160     50

2    165     65

3    170     60

4    175     55

5    160     70

*mydata$Gender로 데이터 프레임 mydata의 변수 Gender에 접근할 수 있고, mydata$Gender NULL을 대입하면 변수 Gender을 삭제 할수 있다

>mydata$Gender <- NULL

>mydata

 

ID  Height  weight

1  1    160     50

2  2    165     65

3  3    170     60

4  4    175     55

5  5    160     70

 

 

2)행과 열의 정보 취득과 데이터의 정렬

함수

기능

ncol(mydata)

데이터 프레임 mydatad의 열수(변수의 수)를 구한다.

nrow(mydata)

mydata의 행수(데이터의 수)를 구한다.

names(mydata)

mydata의 열 이름을 표시한다.

rownames(mydata)

행 라벨을 추출한다.

row.names(mydata)

colnames(mydata)

열 라벨을 추출한다.

col.names(mydata)

mydata[c(1,4,2,5,3)]

1,4,2,5,3 행 순으로 행을 정렬

 

 

*데이터 프레임 mydata1을 변수 HEIGHT의 값이 작은 순으로 정렬해보기

> id <- c(1,2,3,4,5)

> sex <- c( “F” , ”M” , ”M" , "F" , " F ")

> height <- c(160, 165, 170, 155, 166)

> mydata1 <- data.frame(ID=id, Gender= sex , HEIGHT = height)

> mydata1

ID Gender HEIGHT

1  1      F    160

2  2      M    165

3  3      F    170

4  4      M    155

5  5      M    166

>x <- order(mydata1$HEIGHT)    #HEIGHT를 오름차순으로 정렬했을 때의 행 번호 리스트

>mydata1 <- mydata1[ x , ]       # 데이터 작은 순으로 정렬

> mydata1

  ID Gender HEIGHT

4  4      M    155

1  1      F    160

2  2      M    165

5  5      M    166

3  3      F    170

 

 

 

엉망으로 되어있는 라벨 순서를 row.names() 또는 rownames()를 통해 연속된 번호를 지정함으로 행 라벨을 바꿀 수 있다.

 

>rownames(mydata1) <- c(1:nrow(mydata1)) # 행 라벨 변경

>mydata1

 

ID Gender HEIGHT

1  4      M    155

2  1      F    160

3  2      M    165

4  5      M    166

5  3      F    170

 

심화) 2개의 변수에 대해 정렬.

     변수 Gender로 정렬한 다음에, 다시 남(M),(F) 중에서 변수 HEGHT에 대해 정렬

>x <- order(mydata1$Gender, mydata1$HEIGHT)   # 순서대로 정리

>mydata1 <- mydata1[ x , ]                      # 데이터 정렬

> rownames(mydata1)<- c(1:nrow(mydata1))       # 행 라벨 변경

>mydata1

 

ID Gender HEIGHT

1  1      F    160

2  3      F    170

3  4      M    155

4  2      M    165

5  5      M    166