R 프로그래밍 스터디 3일차
배열, 리스트, 데이터 프레임
리스트 [ 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 |