R) 기본 1차원 벡터 - 조작

R) 기본 1차원 벡터 - 조작

이전 포스팅에서 알아본 1차원 벡터를 조작하는 다양한 방법을 알아보도록 하자.

추출

R에서 객체 내부의 무언가를 뽑아내기 위해서는 여러가지 방법이 있지만 우선 대괄호를 기억하면 된다. 영어가 어쩌고 저쩌고 나온 다음에 대괄호가 나오면 어지간하면 객체 내부의 무언가를 뽑아내는 코드라는 것만 기억해도 R코드 작성 난이도가 꽤 낮아지니 참고하자. 그리고 다음 예제를 보자.

1
2
3
4
5
6
7
8
9
aa = c(5, 6, 7)
aa[1] # 1
## [1] 5

aa[2:3] # 2
## [1] 6 7

aa[c(1, 3)] # 3
## [1] 5 7

1번 코드는 aa 객체의 첫 번째 원소를 뽑는 코드이고, 2번 코드는 두 번째와 세 번째 원소를 뽑는 코드이다. 마지막으로 3번 코드는 첫 번째 원소와 세 번째 원소를 뽑는 코드가 되겠다. 즉, 특정 객체에서 추출하고자 하는 원소의 인덱스가 연속(continuous)이라면 2번과 같이, 이산(discrete)인 경우 3번과 같은 코드를 작성하면 되겠다.

치환

특정 위치의 원소를 치환하는 것은 생각보다 간단하다. 원소를 추출하기 위해 사용한 코드를 그대로 활용하면 된다. 그 다음에 할당연산자를 사용하고 할당해줄 값을 작성하면 된다. 이해를 돕기위한 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
bb = c(4, 6, 8)
bb[1] = 100 # 1
bb
## [1] 100 6 8

bb[2:3] = c(200, 300) # 2
bb
## [1] 100 200 300

bb[c(1, 3)] = c("a", "b") # 3
bb
## [1] "a" "200" "b"

1번 코드는 bb 객체의 첫 번째 원소를 치환하는 코드이고, 2번 코드는 두 번째와 세 번째 원소를 치환하는 코드이다. 마지막으로 3번 코드는 첫 번째 원소와 세 번째 원소를 치환하는 코드가 되겠다. 즉, 특정 객체에서 치환하고자 하는 원소의 인덱스가 연속(continuous)이라면 2번과 같이, 이산(discrete)인 경우 3번과 같은 코드를 작성하면 되겠다. 이전에 언급한적 있지만, 숫자로 이루어진 벡터에 문자가 들어갈 경우 문자가 우선시되어 전체 원소 속성이 문자로 바뀌니 주의하도록 하자.

삽입

기본 함수 중에서는 객체 내부에 특정 원소를 삽입하는 함수도 없고 벡터 연산으로도 안된다. 하지만 R.utils 패키지에는 insert() 함수가 그 기능을 수행한다.

1
2
3
4
5
6
7
library("R.utils")
cc = c(1, 3, 5)
insert(x = cc, ats = 2, values = "a") # 1
## [1] "1" "a" "3" "5"

insert(x = cc, ats = c(2, 3), values = c("A", "B")) # 2
## [1] "1" "A" "3" "B" "5"

ats 인자는 특정 위치를 지시하는 at에 복수형으로 뒤에 ‘s’가 붙은 것이라 보면 되겠다. 그리고 values 인자도 마찬가지로 value의 복수형이고 ats 인자와 같이 맞춰서 잘 써주면 된다. 1번 코드 동작을 그림으로 보면 다음과 같다.

1번 코드 동작

실제로 삽입 연산은 데이터 분석 부분에서 거의 할 일이 없으니 굳이 함수를 외울 필요는 없다.

병합

두 객체 덩어리를 병합하는 방법은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
aa = 1:3
bb = 7:9
cc = c("a", "b")

c(aa, bb) # 1
## [1] 1 2 3 7 8 9

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

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

c(aa, c("x", "y", "z")) # 4
## [1] "1" "2" "3" "x" "y" "z"

기본 1차원 벡터는 별도의 함수를 사용하는 것이 아닌 그대로 c() 함수로 해결이 가능하다.

다음의 코드는 병합이라고 하기 보다는 삽입에 가까운 코드이지만 기존 객체의 길이보다 더 큰 인덱스 위치를 지정할경우 다음과 같다.

1
2
3
dd = c(9, 8, 7)
dd[4] = c(6, 7)
## Warning in dd[4] = c(6, 7): number of items to replace is not a multiple of replacement length

앞의 코드는 한 칸에 하나의 원소만 넣을 수 있지만 두 개 이상의 원소를 집어넣으려 했기 때문에 경고가 발생한다. 그림으로 본다면 다음과 같다.

할당 원소 개수가 맞지 않는 경우

그래서 할당하고자 하는 객체에 입력하는 원소 개수를 고려하여 코드를 작성하여야 한다.

1
2
3
dd[4:5] = c(6, 7)
dd
## [1] 9 8 7 6 7

꼭 연속 표현으로 할 필요는 없고 다음과 같이 c() 함수를 사용해도 무방하다.

1
2
3
dd[c(4, 5)] = c(100, 200)
dd
## [1] 9 8 7 100 200

단, c(4:5)4:5와 같고 오히려 계산량이 더 많아지니 사용을 권장하지 않는다.

바로 이어서 인덱스를 지정하지 않고 떨어뜨리는 경우는 그 사이에 결측값(NA)로 메꿔진다.

1
2
3
dd[c(9, 10)] = c(100, 200)
dd
## [1] 9 8 7 100 200 NA NA NA 100 200

이렇게 데이터를 새로 붙여넣는 경우는 인덱스 1, 2 차이로 잘못되는 경우가 허다하다. 그래서 이렇게 인덱스를 직접 지정해서 만드는 경우는 더 주의깊게 확인하는 습관을 기르도록 하자.

기타

R에는 기본적으로 등록되어 있는 1차원 벡터가 있다. lettersLETTERS 이다.

1
2
3
letters
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
1
2
3
LETTERS
## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"

무언가를 새로 만들 때 알파벳 순서대로 입력할 일이 많은데 이 때 이 객체를 이용하면 제법 편리하다. 예를 들어,

1
2
3
4
5
c("a", "b", "c", "d") # 1
## [1] "a" "b" "c" "d"

letters[1:4] # 2
## [1] "a" "b" "c" "d"

1번 코드와 2번 코드가 같기에 알파벳을 순서대로 여러개 입력하는 경우는 기존에 c() 함수를 사용한 작성 보다 훨씬 빠르고 정확하게 코드를 작성할 수 있다.


<객체 시리즈 - 기본 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

×