R) 기본 1차원 벡터 - 생성

R) 기본 1차원 벡터 - 생성

R에는 많은 종류의 객체가 있다. 벡터(vector), 행렬(matrix), 데이터프레임(data.frame)등 다양하다. 그 중에서 데이터를 다루는데 있어 가장 기본이 된다고 할 수 있는 c() 함수로 만드는 1차원 벡터를 알아보도록 하겠다.

쓰임새

분명 앞에서 기본이 된다고 말했다. 이 벡터 그대로 사용하거나 변형을 하거나 여러개를 이어붙인 다음 별도의 속성을 부여한다. 그러니까 숫자/문자 같은 원소가 모든 자료 객체의 근간이 되듯 c() 함수로 만드는 기본 객체는 다른 파생 객체의 근간이 된다고 할 수 있다. R 초심자때 절대적으로 익숙해져야 하는 것이 바로 c() 함수와 1차원 벡터가 되겠다.

생성

원소 1, 2, 3이 들어있는 벡터는 다음과 같이 생성한다.

1
2
c(1, 2, 3)
## [1] 1 2 3

원소의 구분은 쉼표로 한다.

문자를 원소로 가지는 벡터는 다음과 같다.

1
2
c("a", "b", "c")
## [1] "a" "b" "c"

문자와 숫자를 같이 원소로 넣을 수 있다.

1
2
c("a", 1, 2)
## [1] "a" "1" "2"

넣더라도 에러나 경고 없이 실행이 되지만, 문자는 숫자보다 우선시 되기 때문에 c() 함수 내부에 문자와 숫자를 각각 넣더라도 숫자는 문자처럼 양 옆에 따옴표가 붙어버린다. 향후 벡터의 연산과 관련하여 이를 주의해야 한다.

각 원소에 이름을 붙여주려면 다음과 같이 작성할 수 있다.

1
2
3
c(a = 2, b = 3)
## a b
## 2 3

다음과 같이 양 옆에 따옴표를 사용하여 문자로 처리해도 되지만 특별한 경우가 아니면 이렇게 객체를 생성할 일은 없다.

1
2
3
c("c" = 2, "d" = 3)
## c d
## 2 3

그리고 1, 2, 3 같이 연속된 숫자의 경우 생성할 일이 생각보다 많은데 이를 좀 편하게 해주는 코드는 다음과 같다.

1
2
3
4
5
6
7
8
1:3 # 1
## [1] 1 2 3

4:-2 # 2
## [1] 4 3 2 1 0 -1 -2

0.2:3 # 3
## [1] 0.2 1.2 2.2

:연산자는 연산자 앞의 숫자보다 연산자 뒤의 숫자가 더 큰 경우 연산자 앞의 숫자에서 1씩 뒤의 숫자만큼 더하다 멈춘다. 그래서 3번 코드 결과를 보면 2.2 다음에 3.2가 나와야 하지만 3.2는 3 보다 더 크기 때문에 더이상 원소가 생성되지 않고 멈춘것을 볼 수 있다. 그리고 연산자 앞의 숫자보다 연산자 뒤의 숫자가 더 작은 경우 연산자 앞의 숫자에서 1씩 뒤의 숫자만큼 빼주다 멈춘다. 이는 2번 코드를 보면 된다.

1
2
3
4
5
6
7
8
9
10
11
seq(from = 1, to = 3, by = 1) # 1
## [1] 1 2 3

seq(from = 4, to = -2, by = -1) # 2
## [1] 4 3 2 1 0 -1 -2

seq(from = 1, to = 3, by = 0.5) # 3
## [1] 1.0 1.5 2.0 2.5 3.0

seq(from = 1, to = 3, length.out = 9) # 4
## [1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00

:연산자는 편하게 수열을 생성할 수 있도록 도와주지만 그 간격을 조정할 수 있도록 by 인자를 들고있는 seq() 함수도 있다. 1~2번 코드는 앞에서 실습했던 코드를 그대로 seq() 함수 버전으로 바꾼 것이고, 3번 코드는 간격 조정, 4번 코드는 1 부터 3까지 등간격으로 9개 숫자를 산출하는 코드이다. 자주 사용하는 코드는 아니지만 가끔 데이터를 직접 만들어야 할 때 사용되니 참고하도록 하자.

할당(assignment)

기본 할당은 다음과 같다.

1
2
3
aa = c(1, 2, 3)
aa
## [1] 1 2 3

혹시나 동시에 같은 내용의 객체를 만들고 싶다면 다음과 같이 하면 되지만 코드 유지보수 입장에서 권장하지 않는다.

1
2
3
4
5
6
x = y = c(3, 5, 7)
x
## [1] 3 5 7

y
## [1] 3 5 7

벡터 구조

c() 함수로 만드는 객체는 그냥 원소만 있는 경우가 있고, 이름이 별도로 지정된 객체가 있다. 하지만 Python의 list 객체 처럼 객체 안에 객체를 넣는 등 복잡한 구조를 가질수는 없다.

기본 벡터

앞에서 만들어본 원소만 가지는 벡터의 구조는 다음과 같다.

기본 1차원 벡터 구조

각각의 정육면체 안에 하나의 원소가 들어간다고 보면 된다. 그리고 구성 원소에 숫자/문자가 섞여있을 경우 문자가 우선시 되는 특징이 있기 때문에 회색으로 처리해주었다.

이름이 있는 벡터

영어로는 named vector 라고 한다. 앞에서 만들어봤지만 기본 벡터 각각의 원소에 이름이 붙은 것이다. 그림으로 보자면 다음과 같다.

이름이 있는 1차원 벡터 구조

생성 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
vec = c("a" = 2, "b" = 4, "c" = 6)
vec
## a b c
## 2 4 6

names(vec)
## [1] "a" "b" "c"

as.numeric(vec)
## [1] 2 4 6

이름만 추출하고자 할 때는 names() 함수를 사용하면 되고, 원소가 숫자인 경우에 숫자만 뽑아내려면 as.numeric() 함수를 사용하고 문자의 경우는 as.character()를 쓸 수 있다.

명명 규칙

객체는 이름을 잘 지어주어야 한다. 앞에서는 단순 예제이기 때문에 a, b 같은 단순한 것으로 했으나 실제 분석 프로젝트에서는 객체명만 보고도 대략 객체 내부의 내용이 짐작 가능하게 하는 것이 좋다. 별거 아닌 것 같지만 나중에는 다루게 되는 객체가 50개가 넘어가는 경우가 흔하기 때문에 이름을 명확하게 하지 않거나 a, b, c 등 영어 알파벳을 남발하여 z까지 가는 순간 굉장히 혼란스러울 수 있다.


<객체 시리즈 - 기본 1차원 벡터>
R) 기본 1차원 벡터 - 생성
R) 기본 1차원 벡터 - 조작
R) 기본 1차원 벡터 - 연산
R) 기본 1차원 벡터 - 리사이클링

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×