이번 장에서는 벡터의 인덱싱에 대해 알아보도록 하겠다. 파이썬을 기준으로 잡고 설명을 해보겠다.
# python
x= [2,4,6,8,10]
len(x) # 5
x[0] # 2
# R
x<- c(2,4,6,8,10)
length(x) # 5
x[1] # 2
python에서 리스트를 생성하고 길이를 반환하고 첫번째 값을 반환하는 것이 위에 3줄 코드이다.
반면에 R은 벡터를 생성하고 length() 함수를 통해 벡터의 길이를 반환한다.
이 때, 다른 점은 인덱스 번호가 python은 0부터 시작이지만 R은 1부터 시작이다.
# python
x[0,1] # error!
x[[0,1]] # error!
# R
x[1,2] # error!
x[c(1,2)] # 2 4
앞에서 생성한 x 리스트의 인덱스를 한번에 반환받는 것이다. 파이썬은 각각을 출력하지 못하지만 R은 벡터형식을 받아서 인덱싱을 할 수 있다.
# R
x[-c(1,2,3)] # 8 10
x[c(1:3)] # 2 4 6
x[1:3] # 2 4 6
이를 응용한 버전이다. 첫 코드는 앞에 -를 붙여 첫번째 두번째 세번째 값을 제외하고 출력하는 것이다.
두번째 코드와 세번째 코드는 같다. 같은 이유는 1:3은 벡터형식이기 때문이다. 그 전 장을 참고하면 될 것이다.
다음으로 벡터의 다른 함수에 대해 알아보겠다.
all(x>5) # x 요소값이 모두 5보다 큰가?
# False
any(x>5) # x 요소값이 일부 5보다 큰가?
# True
x<-1:10 # x 재정의
head(x) # 기본 6개 데이터 추출
# [1] 1 2 3 4 5 6
tail(x) # 기본 6개 데이터 추출
[1] 5 6 7 8 9 10
head(x, 3) # 3개 데이터 추출 = x[c(1:3)]
[1] 1 2 3
tail(x, 3) # 3개 데이터 추출 = x[c(8:10)]
[1] 8 9 10
x <- c(1, 2, 3)
y <- c(3, 4, 5)
z <- c(3, 1, 2)
union(x, y) # 합집합
# [1] 1 2 3 4 5
intersect(x, y) # 교집합
[1] 3
setdiff(x, y) # 차집합(x기준 동일요소 제외)
[1] 1 2
setdiff(y, x) # 차집합(y기준 동일요소 제외)
[1] 4 5
setequal(x, y) # x와 y가 동일한지 비교
[1] FALSE
setequal(x, z) # x와 z가 동일한지 비교
[1] TRUE
위 코드는 설명을 따로 하지 않겠다.
다음으로 벡터의 연산 수행에 대해 알아보겠다.
#벡터끼리 연산수행
x <- c(1, 2, 3, 4)
y <- c(5, 6, 7, 8)
z <- c(3, 4)
w <- c(5, 6, 7)
x+2 # x 개별요소에 2를 각각 더함
x + y # x와 y 크기가 동일 -> 각요소 더함
# [1] 3 4 5 6
x + z # x와 z 크기가 정수배 -> 작은쪽 순환 더함
# [1] 4 6 6 8
x + w # x와 w 크기가 정수배 아님 -> 에러(하지만 무시할 수 있는 에러)
# [1] 6 8 10 9
벡터에 스칼라 값을 연산하면 각각 요소마다 연산을 수행한다.
그리고 가장 중요한 것인데 R의 벡터 연산은 일종의 broadcasting개념을 사용하게 된다. 두 벡터의 크기가 다른 경우 작은 크기의 정수배로 늘어나서 계산이 된다. 즉 x+z = [1,2,3,4] + [3,4,3,4] 로 되서 각 위치에 있는 값과 연산을 하게 된다. 만약 x+w 처럼 정수배가 딱 맞게 떨어지지 않을 경우는 warning error 가 나지만 무시해도 되는 에러임으로 계산은 되고 x+w = [1,2,3,4] + [5,6,7,5] 로 계산이 된다.
댓글