ADsP R기초

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

벡터와 수열★

벡터

지금까지는 변수에 하나의 데이터만 저장했습니다. 하지만 R로 통계나 '빅'데이터 분석을 하게 되면 작게는 몇 개, 크게는 몇 억 개의 데이터를 처리해야 합니다. 그러면 어떻게 할까요?

#숫자 여러 개를 모아서 숫자 벡터를 만듭니다.
> numbers <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)

이렇게 여러 데이터를 모아서 변수 하나에 저장하면 벡터라 합니다.
벡터를 만들 때에는 c()함수를 씁니다.

#예를 들어 다음과 같은 코드는 문자열 벡터를 만듭니다.
planets <- c("수성", "금성","지구","화성","목성","토성","천왕성","해왕성")

(기출) 벡터는 특이한 면이 있습니다. 

> strings <- c("태희", 3.14, TRUE) #이렇게 하면 어떻게 될까요?
> strings
[1] "태희" "3.14" "TRUE"

모두 따옴표가 붙었습니다. 문자열이라는 뜻이죠. 자동으로 모두 문자열로 바뀐 겁니다. 이걸 '문자열 모드'라고 합니다.
벡터는 자료형이 같아야 하기 때문에, 자료형이 다르면 모드를 똑같이 맞춥니다. 이런 성질을 보고 벡터는 동질적이라고 합니다.

벡터는 여러 값을 한 번에 계산할 때 편리합니다. 예를 들어 구구단 표를 만들고 싶다면 하나하나 81번 곱셈을 치는 건 귀찮을 겁니다. 하지만 벡터를(그리고 뒤에 나올 수열을 함께) 사용하면 구구단 표 정도는 단 한 줄로 만들 수 있습니다. 지금부터 벡터가 얼마나 쓸모 있는지 보여드리겠습니다.

기출 연습문제

다음 중 벡터에 할당하는 모드가 다른 것은?

힌트

> pi
[1] 3.141593
> number <- 7
> number
[1] 7

1. c("김", "동방", "유", "박")

2. c(pi, "pi", 3.14)

3. c(3.14, pi, TRUE)

4. c(5, number, "백두산")

정답은 직접 실행해서 확인해보세요.

벡터와 벡터 사칙연산하기

#numbers 벡터가 어떻게 생겼는지 잠시 돌이켜봅시다.
> numbers
[1] 1 2 3 4 5 6 7 8 9

#벡터에 숫자를 더하면, 모든 자리에 해당 숫자를 더해줍니다.
> numbers + 3

#벡터에 벡터를 더하면, 같은 자리에 있는 것끼리 더해줍니다.
> numbers + numbers
[1]  2  4  6  8 10 12 14 16 18

# 문제입니다. 벡터에 숫자를 곱하면 어떻게 될까요? 결과는 직접 실행해서 알아보세요.
> numbers * 3
 
#벡터에 벡터를 곱하면 어떻게 될까요? 결과는 직접 실행해서 알아보세요. 왜 이런 결과가 나올까요?
#실행해보시면 아시겠지만 R의 벡터는 수학의 벡터와 다릅니다. 벡터 곱을 어떻게 해도 이런 결과가 나오지 않겠죠.
> numbers * numbers
[1]  1  4  9 16 25 36 49 64 81

 # %o% 연산자를 벡터에 쓰면 구구단 표를 만들 수 있습니다.
> numbers %o% numbers
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    2    3    4    5    6    7    8    9
 [2,]    2    4    6    8   10   12   14   16   18
 [3,]    3    6    9   12   15   18   21   24   27
 [4,]    4    8   12   16   20   24   28   32   36
 [5,]    5   10   15   20   25   30   35   40   45
 [6,]    6   12   18   24   30   36   42   48   54
 [7,]    7   14   21   28   35   42   49   56   63
 [8,]    8   16   24   32   40   48   56   64   72
 [9,]    9   18   27   36   45   54   63   72   81

벡터의 색인(index)

#우리 문자열 벡터를 다시 살펴봅시다.
> strings
[1] "태희" "3.14" "8"
#첫 항목을 뽑아내고 싶으면 색인으로 [1]을 써줍니다.
> strings[1]
"태희"

# 문제 : [3]을 붙여주면 무엇이 나올까요?
> strings[3]

#벡터의 길이를 재고 싶으면 length함수를 씁니다.
> length(numbers)
[1] 9
> 문제 : 아주 긴 벡터의 길이도 잴 수 있습니다. 다음 수열의 길이는?
> length( c(1,3,5,6,7,8,34,342,3,54,4,3,3,653,3,4,2,3,2,7,34))

수열

1에서 10까지를 매번 하나하나 손으로 타자를 치는 건 비효율적입니다. 그래서 수열을 씁니다. 아래 세 코드는 같은 뜻입니다.

> numbers <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
> numbers <- seq(from=1, to=9, by=1)
> numbers <- 1:9

> numbers
 [1]  1  2  3  4  5  6  7  8  9

seq함수는 좀 특별합니다. 영어로 sequence는 수열이라는 뜻인데요.

by 값을 바꿔주면 한 번에 여러 칸을 뛰어넘을 수 있습니다.

> jump3 <- seq(from=1, to=10, by=3)
> jump3
[1]  1  4  7 10
# 문제. jump2의 값은 어떻게 될까요?
> jump2 <- seq(0,10,2)
> jump2

이제 약속대로 구구단 표를 단 한 줄로 만들 수 있습니다.

> 1:9 %o% 1:9
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    2    3    4    5    6    7    8    9
 [2,]    2    4    6    8   10   12   14   16   18
 [3,]    3    6    9   12   15   18   21   24   27
 [4,]    4    8   12   16   20   24   28   32   36
 [5,]    5   10   15   20   25   30   35   40   45
 [6,]    6   12   18   24   30   36   42   48   54
 [7,]    7   14   21   28   35   42   49   56   63
 [8,]    8   16   24   32   40   48   56   64   72
 [9,]    9   18   27   36   45   54   63   72   81

때로는 숫자가 점점 커지는 수열 말고 똑같은 숫자를 반복하고 싶을 때도 있습니다. 그런 때에는 rep()함수를 씁니다. 영어로 반복하다를 뜻하는 repeat의 약자입니다.

> rep(1, 10)
 [1] 1 1 1 1 1 1 1 1 1 1

벡터 재활용 규칙

벡터끼리 계산을 하면 같은 자리에 있는 걸 계산한다 했었죠. 그렇다면 길이가 다른 경우에는 어떻게 할까요?

> a <- c(1,2,3,4)
> b <- c(1,2,3,4,5,6,7)

> a + b
[1] 2 4 6 8 6 8 10
Warning message:
In a + b : longer object length is not a multiple of shorter object length

길이가 맞지 않으면 길이가 맞을 때까지 원래 있는 벡터를 복사해서 반복합니다. 이걸 재활용 규칙이라 부르죠.

그러면 에러가 뜨지 않게 하려면 어떻게 하면 될까요? 한 벡터의 길이가 다른 벡터의 배수가 되게 해주면 됩니다. 예를 들어 이렇게요.

> 1:4 + 1:8
[1]  2  4  6  8  6  8 10 12

기출 + 연습 문제

[기출 변형] 다음중 r에 저장된 값이 다른 것은?

  1. r <- 1:10
  2. r = 1:10
  3. r <- seq(1,10,1)
  4. r <- c(1,10)

댓글

댓글 본문
작성자
비밀번호
버전 관리
Taehee Kim
현재 버전
선택 버전
graphittie 자세히 보기