[R프로그래밍] 벡터, 리스트, 팩터

📌 벡터

1차원 배열 데이터 ex) 몸무게, 영어 성적
2차원 배열 데이터 ex) 전과목 성적

✔ 벡터만들기

> x <- c(1,2,3) 
> y <- c("a","b","c")
> z <- c(TRUE, TRUE, FALSE, TRUE)
> w <- c(1,2,3,"a","b","c")
> x
[1] 1 2 3
> y
[1] "a" "b" "c"
> z
[1]  TRUE  TRUE FALSE  TRUE
> w
[1] "1" "2" "3" "a" "b" "c"

✔ 연속적인 숫자로 이루어진 벡터 생성

> v1 <- 50:90
> v1
 [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[24] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

> v2 <- c(1,2,5,50:90)
> v2
 [1]  1  2  5 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
[24] 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

✔ 일정한 간격의 숫자로 이루어진 벡터 생성

> v3 <- seq(1,101,3)
> v3
 [1]   1   4   7  10  13  16  19  22  25  28  31  34  37  40  43  46  49
[18]  52  55  58  61  64  67  70  73  76  79  82  85  88  91  94  97 100

> v4 <- seq(0.1, 1.0, 0.1)
> v4
 [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

✔ 반복된 숫자로 이루어진 벡터 생성

> v5 <- rep(1,times=5) #1을 5번 반복
> v5
[1] 1 1 1 1 1

> v6 <- rep(1:5, times=3) #1에서 5까지 3번 반복
> v6
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
 
> v7 <- rep(c(1,5,9), times=3) #1,5,9를 3번 반복
> v7
[1] 1 5 9 1 5 9 1 5 9

✔ 벡터의 원소값에 이름 지정

> score <- c(90,85,70) #성적
> score
[1] 90 85 70

> names(score) #score에 저장된 값들의 이름
NULL

> names(score) <- c("john", "tom", "jane") #값들에 이름 부여
> names(score)
[1] "john" "tom"  "jane"

> score #이름과 함께 값이 출력
john  tom jane 
  90   85   70 

✔벡터에서 원소값 추출

> d <- c(1,4,3,7,8)
> d[1]
[1] 1
> d[3]
[1] 3
> d[6]
[1] NA

✔ 여러 개의 값 한 번에 추출

> d <- c(1,4,3,7,8)

> d[c(1,3,5)] #1,3,5번째 값 출력
[1] 1 3 8

> d[1:3] #처음 세 개의 값 출력
[1] 1 4 3

> d[seq(1,5,2)] #홀수번재 값 출력
[1] 1 3 8

> d[-2] #2번째 값 제외하고 출력
[1] 1 3 7 8

> d[-c(3:5)] #3~5번째 값 제외하고 출력
[1] 1 4

✔ 이름으로 값 추출

> GNP <- c(2090, 2450, 960)
> GNP
[1] 2090 2450  960

> names(GNP) <- c("korea","japan","nepal")

> GNP
korea japan nepal 
 2090  2450   960 
 
> GNP[1]
korea 
 2090 
 
> GNP["korea"]
korea 
 2090 
 
> GNP[c("korea","japan","nepal")]
korea japan nepal 
 2090  2450   960 

✔ 벡터에 저장된 원소값 변경

> v1 <- c(1,5,7,8,9)
> v1
[1] 1 5 7 8 9

> v1[2] <- 3 #v1의 2번째 값을 3으로 변경
> v1
[1] 1 3 7 8 9

> v1[c(1,5)] <- c(10,20) #v1의 1,5번째 값을 각각 10,20으로 변경
> v1
[1] 10  3  7  8 20

✔ 벡터의 연산

벡터와 숫자값 연산
벡터에 대한 산술 연산은 벡터 안에 포함된 값들에 대한 연산으로 바뀌어 실행

> d <- c(1,4,3,7,8)

> 2*d
[1]  2  8  6 14 16

> d-5
[1] -4 -1 -2  2  3

> 3*d+4
[1]  7 16 13 25 28

벡터와 벡터 간의 연산
벡터 간의 대응되는 위치에 있는 값끼리의 연산으로 바꾸어 실행

> x <- c(1,2,3)
> y <- c(4,5,6)

> x+y
[1] 5 7 9

> x*y
[1]  4 10 18

> z <- x+y #x,y를 더하여 z에 저장
> z
[1] 5 7 9

✔ 벡터에 적용 가능한 함수

> d <- c(1,2,3,4,5,6,7,8,9,10)

> sum(d) #d에 포함된 값들의 합
[1] 55
> sum(2*d) #d에 포함된 값들에 2를 곱한 후 합한 값
[1] 110

> length(d) #d에 포함된 값들의 개수
[1] 10

> mean(d[1:5]) #1~5번째 값들의 평균
[1] 3

> max(d) #d에 포함된 값들의 최댓값
[1] 10
> min(d) #d에 포함된 값들의 최솟값
[1] 1

> sort(d) #오름차순 정렬
 [1]  1  2  3  4  5  6  7  8  9 10
> sort(d, decreasing=FALSE) #오름차순 정렬
 [1]  1  2  3  4  5  6  7  8  9 10
> sort(d, decreasing=TRUE) #내림차순 정렬
 [1] 10  9  8  7  6  5  4  3  2  1

✔ 논리연산자 사용

> d <- c(1,2,3,4,5,6,7,8,9)

> d>=5
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
> d[d>5] #5보다 큰 값
[1] 6 7 8 9

> sum(d>5) #5보다 큰 값의 개수 출력
[1] 4
> sum(d[d>5]) #5보다 큰 값의 합계 출력
[1] 30

> d==5
[1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

> condi <- d>5 & d<8 #조건을 변수에 저장
> d[condi] #조건에 맞는 값들을 선택
[1] 6 7

📌 리스트

서로 다른 자료형의 값들을 1차원 배열에 저장하고 다룰 수 있도록 해주는 수단

> ds <- c(90,85,70,84)

> my.info <- list(name='Tom', age=60, status=TRUE, score=ds)
> my.info #리스트에 저장된 내용을 모두 출력
$name
[1] "Tom"

$age
[1] 60

$status
[1] TRUE

$score
[1] 90 85 70 84

> my.info[[1]] #리스트의 첫 번째 값 출력
[1] "Tom"
> my.info$name #리스트에서 값의 이름이 name인 값 출력
[1] "Tom"

> my.info[[4]] #리스트의 네 번째 값 출력
[1] 90 85 70 84

📌 팩터

문자형 데이터가 저장된 벡터의 일종
성별, 혈액형, 선호 정당 등과 같이 저장할 문자값들이 몇 종류로 정해져 있을 때 팩터를 사용

> bt <- c('A','B','B','O','AB','A') #문자형 벡터 bt 정의

> bt.new <- factor(bt) #벡터 bt.new 정의

> bt #벡터 bt의 내용 출력
[1] "A"  "B"  "B"  "O"  "AB" "A" 
> bt.new #팩터 bt.new의 내용 출력
[1] A  B  B  O  AB A 
Levels: A AB B O

> bt[5] #벡터 bt의 5번째 값 출력
[1] "AB"
> bt.new[5] #팩터 bt.new의 5번째 값 출력
[1] AB
Levels: A AB B O

> levels(bt.new) #팩터에 저장된 값의 종류를 출력
[1] "A"  "AB" "B"  "O" 

> as.integer(bt.new) #팩터의 문자값을 숫자로 바꾸어 출력
[1] 1 3 3 4 2 1

> bt.new[7] <- 'B' #팩터 bt.new의 7번째에 'B'저장
> bt.new[8] <- 'C' #팩터 bt.new의 8번째에 'C'저장, C는 없어서 오류
경고메시지(들): 
In `[<-.factor`(`*tmp*`, 8, value = "C") :
  invalid factor level, NA generated
  
> bt.new #팩터 bt.new의 내용 출력 (변경된 내용과 없는 건 <NA>로 출력
[1] A    B    B    O    AB   A    B    <NA>
Levels: A AB B O

좋은 웹페이지 즐겨찾기