091
[R] 자료구조(1): 벡터(Vector) 본문
1. 자료구조
(1) Vector
- 같은 타입만을 가지는 1차원 배열로, 모든 자료구조의 기초입니다. combine의 약자인 c(...)결합함수, 같은 타입의 여러 값을 하나의 벡터로 결합하는데 사용합니다.
v.numeric <- c(1,2,3)
v.character <- c("A","B","C")
v.logical <- c(T,F,TRUE,FALSE)
v.character.numeric <- c("A","B","C",1,2,3) #숫자도 문자로 변경
v.character.numeric #[1] "A" "B" "C" "1" "2" "3"
v.logical.numeric <- c(1,2,3,T,F,TRUE,FALSE) #논리도 숫자로 변경
v.logical.numeric #[1] 1 2 3 1 0 1 0
-> 같은 타입을 가져야하기 때문에 변수 변환에서 더 우위에 있는 문자열로 변경됩니다. 문자, 숫자, 논리 순으로 우위가 더 높습니다.
v1 <- c(50:90) #연속적인 값 표현, 역순도 가능
v2 <- c(1,2,3,50:90)
v3 <- seq(1,101,3) #일정한 간격의 숫자로 이루어진 벡터
v4 <- seq(0.1,1.0,0.1)
v5 <- rep(1,times=5)#반복된 숫자로 이루어진 벡터
v6 <- rep(1,times=3)
v7 <- rep(c(1,5,9),times=3) #1 5 9 1 5 9 1 5 9
v8 <- rep(c(1,5,9),each=3) # 1 1 1 5 5 5 9 9 9
-> :(콜론)을 활용해서 1씩 증가하거나 감소하는 정수 수열을 만들 수 있습니다.
-> 일정한 간격의 숫자로 이루어진 벡터를 만들 때는 seq() 함수를, 반복된 숫자로 이루어진 벡터를 만들 때는 rep() 함수를 사용합니다.
score <- c(90,85,73)
score[1] #[1] 90
score[2] #[1] 85
score[3] #[1] 73
score[4] #NA(결측값)
score[c(1,2,3)] #[1] 90 85 73
score[-1] #해당 인덱스를 제외(-)한 값을 추출,[1] 85 73
score[1:2] #[1] 90 85
score[-c(2,3)] #[1] 90
-> 벡터에서 원하는 값을 추출할 때는 [](대괄호)를 사용해서 명시하며, 벡터는 가장 첫번째 인자부터 인덱스 1, 2, 3...씩 갖습니다. 만약에 값이 없는 인덱스로 추출을 시도할 때는 NA가 나옵니다. 특정 인덱스를 제외하고 추출하고 싶을 때는 - 기호를 사용하여 추출합니다.
-> 각 값에 이름(라벨)을 붙일 수 있으며 이것은 열 이름과 비슷합니다. 아래처럼 names()라는 함수를 사용합니다. 이름을 지정한 뒤에도 인덱스로 추출이 가능하며 이제 각 값을 추출할 때마다 이름이 함께 출력됩니다. 그리고 이름은 언제나 문자열로 처리됩니다.(숫자형이나 논리형으로 작성하면 "TRUE","FALSE","1","2"로 지정됩니다.)
names(score) #NULL
names(score) <- c("John","Tom","Jane")
names(score) #[1] "John" "Tom" "Jane"
score[1]
score["John"]
#John
# 90
+) 이름을 지정하기 전까지는 이 값이 이 벡터의 몇 번째 표시되는 [1] 표식(인덱스 힌트)이 나왔지만 이름을 지정하고 나서는 나오지 않습니다.
score[1] <- 99
score
#John Tom Jane
# 99 85 73
score["John"] <- 88
score
#John Tom Jane
# 88 85 73
-> []은 단순히 값만을 추출해오는 것이 아니라, 실제 주소로 연결되는 통로이기 때문에 새값을 <- 할당하면 원래 값이 변경됩니다.
+) 문자열 벡터에 이름을 붙여주고 나서 출력될 때도 내부 값은 쌍따옴표값과 함께 출력됩니다.
w <- c("a","b","c")
names(w) <- c("John","Tom","Jane")
w
# John Tom Jane
# "a" "b" "c"
| 함수명 | 기능 |
| sum() | 벡터에 포함된 값들의 합 |
| mean() | 벡터에 포함된 값들의 평균 |
| midian() | 벡터에 포함된 값들의 중앙값 |
| max(), min() | 벡터에 포함된 값들의 최댓값, 최솟값 |
| var() | 벡터에 포함된 값들의 분산 |
| sd() | 벡터에 포함된 값들의 표준편차 |
| sort() | 벡터에 포함된 값들을 정렬(오름차순이 기본) |
| range() | 벡터에 포함된 값들의 범위(최솟값 최댓값) |
| length() | 벡터에 포함된 값들의 개수(길이) |
d <- c(3,5,9)
sum(d) #[1] 17
mean(d) #[1] 5.666667
median(d) #홀수일 때는 중앙값, 짝수이면 연산한 중앙값: [1] 5
max(d) #[1] 9
min(d) #[1] 3
sort(d) #기본값이 오름차순: [1] 3 5 9
sort(d, decreasing=FALSE) #[1] 3 5 9
sort(d, decreasing=TRUE) #[1] 9 5 3
range(d) #[1] 3 9
length(d) #[1] 3
v2 <- sum(d)/length(d) #mean값과 동일
v2 #[1] 5.666667
-> median()은 해당 벡터의 length()가 홀수면 값의 실제 중앙값을 뱉고, 만약에 d가 c(1,5,6,1000)이라면 5와 6의 평균값인 5.5를 출력합니다.
d <- c(3,5,9)
d==5 # [1] FALSE TRUE FALSE
d+1 # [1] 4 6 10
d[d>3] #[1] 5 9
v_long <- c(10, 20, 30) # 길이 3
v_short <- c(1, 2) # 길이 2
v_long + v_short #여기서 1을 최종으로 사용하고 2가 버려짐
#In v_long + v_short :
# longer object length is not a multiple of shorter object length
-> 이렇게 벡터에다가 논리나 산술연산자를 사용할 경우에는 원소별로 연산이 진행되며, 이런 것을 벡터화(Vectorization)라고 합니다. 숫자와 벡터를 연산할 때는 벡터 내부 원소에 각각 적용되며, 벡터와 벡터를 할 때는 위치가 같은 값들끼리 연산합니다. 만약에 벡터의 길이가 다르다면 짧은 쪽의 벡터 원소를 재활용하는 재활용 규칙을 이용하여 연산합니다.(이때는 버려진 원소가 생기기 때문에 경고가 발생합니다. 의도한 결과라면 무시하면 됩니다.)
Q. R의 출력결과를 보면 위처럼 뒤로 쏠리는 현상이 일어나는건가요?
A. 아닙니다. 결과값을 보면 그렇게 오해할 부분이 있지만 사실 가독성을 높이기 위해 가장 긴 글자(자릿수)를 기준으로 칸을 맞추고 있기 때문에 FALSE(5글자)^^(칸개수를맞추기위한공백1자)TRUE(4글자) 이렇게 돼서 뒤에 FALSE와 더 가까운 느낌이 들수 있습니다. 하지만 만약에 조건을 d==9로 바꾼다면 맨 마지막 TRUE 앞에만 공백이 생길 것입니다.
sum(d>5) #논리형을 숫자계산 -> 조건에 해당하는 벡터 값 개수 출력, [1] 1
sum(d[d>5]) #[1] 9
-> 벡터화와 함수를 활용한 예시입니다.
'Programming Language > R' 카테고리의 다른 글
| [R] 기초문법(조건문, 반복문, 함수) (0) | 2026.04.06 |
|---|---|
| [R] 파일 데이터 읽기/쓰기 (0) | 2026.04.06 |
| [R] 자료구조(3): 매트릭스(Matrix) & 데이터프레임(Dataframe) (0) | 2026.04.01 |
| [R] 자료구조(2): 리스트(List) & 팩터(Factor) (0) | 2026.04.01 |
| [R] 기초문법(연산자, 변수, 기본 자료형) (0) | 2026.03.29 |