본문 바로가기
언어/R

[R-005] 벡터(Vector) 2

by 천왕지짐 2023. 3. 29.

앞에서는 벡터가 무엇인지 알아봤다면 여기에서는 벡터를 조작하는 방법에 대해 알아보려고 한다. 

잠시 쉬어가기 : https://kilhwan.github.io/rprogramming/ch-visualization.html

 

1. c()함수를 이용하여 벡터 생성하기
이미 알고 있는 것 처럼 괄호안의 자료를 나열함으로써 벡터를 생성할 수 있고 두 벡터를 이어붙이거나 해당 값의 이름을 붙일 수도 있다. 각각에 대해 알아보고 실습해 보자.

실습 벡터 생성하기

> x <- c(1, 3, 5, 7, 9)   # 수치자료 벡터
> x
[1] 1 ,3, 5, 7, 9
> s <- c('lee', 'kim', 'im')
> s
[1] "lee" "kim" "im"


실습 두 백터 이어 붙이기

> c(x, c(11, 13))     # 위 실습을 하지 않고 하면 에러가 발생된다. 벡터는 같은 유형의 값을 가져야 한다는 것을 기억하자.
[1] 1 ,3, 5, 7, 9, 11, 13
> s <- c(s, 'choi', 'part')
> s
[1] "lee" "kim" "im" "choi" "park"


실습 원소의 이름과 값을 함께 입력하기

> x=c(x1=1, x2=2, x3=0)
> x
x1 x2 x3     # 이줄을 names라고 한다.
 1  2  0 


실습 위와 동일한 결과를 다른 형태(names()함수)로 실습하기.

> x=c(1,2,0)
> names(x)=c('x1','x2','x3')
> x
x1 x2 x3 
 1  2  0 


실습 수치와 문자 함께 생성하기

> t=c('Kim',20, 'Lee', 21, 'Park', 25)
> t
[1] "Kim"  "20"   "Lee"  "21"   "Park" "25"  

  

2. 콜론 “:” 이용하기
1씩 증가하는 자료 열을 생성하고자 할 때는 일일이 다 써주지 말고 콜론(초기값:최종값)을 사용하자.

실습 콜론 사용하기

> x=1:10; y=-2:2 
> x; y
[1]  1  2  3  4  5  6  7  8  9 10
[1] -2 -1  0  1  2
> z=0.5:4.8
> z
[1] 0.5 1.5 2.5 3.5 4.5

 


3. seq()함수 이용하기
seq는 Sequence Generatond의 약어이다. “:”은 1씩 증가하는 수열을 생성했다. 임의로 값으로 증가 또는 감소하는 수열을 만들려면 “seq()” 함수를 이용해야 한다. 그리고 초기치와 최종치 사이를 n등분하여 수열을 생성할 때는 옵션 "length=n"을 사용한다.

형식 : seq(초기값, 최종값, by=증가값) 및 seq(초기값, 최종값, length=길이)

실습 0.5부터 4.8까지 0.2 씩 증가하는 수열 만들기

> x=seq(0.5, 4.8, by=0.2)
> x
 [1] 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 2.1 2.3 2.5
[12] 2.7 2.9 3.1 3.3 3.5 3.7 3.9 4.1 4.3 4.5 4.7


실습 2에서 1까지 0.1씩 감소하는 수열 만들기

> x=seq(2.0, 1.0, by=-0.1)
> x
 [1] 2.0 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0


실습 1부터 10 사이를 5등분 하기

> seq(1, 10, length=5)
[1]  1.00  3.25  5.50  7.75 10.00



4. rep()함수 이용하기
rep는 Replicaton Elements of Vectors and Lists의 약어이다. 이 함수는 어떤 자료열을 반복해서 생성한다. 

형식 : rep(자료벡터, times=n) 혹은 rep(자료벡터, n)

 

실습 반복 실습하기

> rep(c(1,2),times=3)
[1] 1 2 1 2 1 2
> x=c(1,2); rep(x, 3)
[1] 1 2 1 2 1 2
> rep('Hi! ', 3)
[1] "Hi! " "Hi! " "Hi! "

만약 times를 생략하면, times=1로 간주한다.

 


5. paste()함수 이용하기
이 함수는 문자열들을 결합하여 새로운 문자열 자료를 생성한다. 

형식 : paste(문자열, 문자열, …, 문자열, sep=‘구분자’)

실습 문자열 결합하기

> paste('Hi,', 'my', 'R!', sep=' ')
[1] "Hi, my R!"

 

  
6. scan()함수 이용하기
이 함수는 콘솔을 통해 자료를 순차적으로 입력하거나, 자료 파일을 읽어드리는 함수이다.

형식 : scan(), scan(what="")

실습 수치자료 입력하기

> x=scan()
1: 2
2: 0
3: -1
4:              # 여기서 엔터키 두 번 입력하면 끝마칠 수 있다.
Read 3 items
> xㅓ
[1]  2  0 -1 


실습 문자자료 입력하기

> s=scan(what="")     #위에서 처럼 s=scan()만 사용하면 에러가 발생된다.
1: A
2: B
3: C
4:           # 여기서 엔터키 두 번 입력
Read 3 items
> s
[1] "A" "B" "C"



7. 연산자
이미 알고 있는 부분이라고 생각되어 간단한 실습만 해보도록 하겠다.
수치 연산과는 다르게 비교연산과 논리연산의 결과는 오직 “TRUE” 아니면 “FALSE” 이다. 

실습 연산자 실습하기

> 1>2
[1] FALSE
> x=1:10 
> 1>2 || !2*2==4
[1] FALSE 
> x=1;y=2; x<2 & y>=2 
[1] TRUE



8. 수치함수
R에는 많은 수치함수들이 있다. 필요할 때 찾아서 사용하면 될 듯 하다.


9. 자료 벡터의 원소 지정과 치환
프로그래밍을 작성하다 보면, 주어진 자료 벡터의 원소들이 무엇인지 알아보거나, 참조 혹은 치환해야 하는 경우가 많다. 이 방법에 대해 알아보자.

1) 원소 지정(Indexing and Slicing)
원소의 지정은 변수 옆에 대괄호를 사용한다.

인덱싱:    x[인덱스], x[ c(인덱스들) ]
슬라이싱 : x[ 시작:끝 ], x[ -인덱스 ] 와 같은 방식으로 접근한다. 

한편 인덱스 앞에 “-”부호가 있으면 “해당 인덱스를 제외한 나머지”라는 의미이며, “x[]”는 x의 모든 원소를 지칭한다.

실습 원소 지정하기

> x=c(2, 1, 0, -1)
> x[1]                   # x의 첫 번째 원소
[1] 2
> x[2:3]                 # x의 2, 3 번째 원소
[1] 1 0
> x[c(2,3)]               # x의 2, 3 번째 원소
[1] 1 0
> x[c(3,1,4)]             # x의 3, 1, 4 번째 원소
[1] 0 2 –1
> x[-c(2,3)]             # x의 2,3 번째를 제외한 나머지 원소
[1]  2 –1
> x[]                   # x의 모든 원소
[1] 2 1 0 –1


2) 원소 치환(Substitution)
원소의 치환은 다음과 같이 한다.

 x[ 인덱스 벡터 ] =  값 벡터  와 같은 방식으로 접근한다. 

실습 원소 치환하기

> x=c(2, 1, 0, -1)
> x[1]=0; x               # x의 1번째 원소를 0으로 치환
[1]  0  1  0 -1
> x[c(2,3)]=c(-1,-2); x      # x의 2,3번째 원소를 각각 –1, -2로 치환
[1]  0 -1 -2 -1
> x[c(3,1,4)]=c(0,1,1); x     # x의 3,1,4번째 원소를 각각 0,1,1로 치환
[1]  1 -1  0  1
> x[]=2; x                 # x의 모든 원소를 2로 치환
[1] 2 2 2 2


3) 원소의 제거
벡터의 원소를 제거하는 특별한 함수나 명령어는 없다. 그러나 음의 인덱스를 이용하여 벡터의 원소를 제거하는 기능을 할 수 있다. 
즉, 
x = x[ -제거하고자 하는 인덱스 벡터 ]  
x = x[ TRUE 및 FALSE 값 벡터 ] 

실습 원소 제거하기

> x=c(2,1,0,-1)
> x=x[-1]; x        #x의 1번째 원소 제거 
[1]  1  0 -1
> x=c(2,1,0,-1)
> x=x[-c(2,3)]; x    #x의 2,3번째 원소 제거
[1] 2, -1
> x=c(2,1,0,-1)
> x=x[c(T,F,F,T)]    #x의 2,3번째 인덱스는 FALSE 나머지는 TRUE로 지정
[1] 2, -1

※ 원소 지정시 True, False 대신에 T, F를 사용해도 된다. 

 


10. 벡터의 연산
자료벡터의 연산은 원소별 연산으로 수행된다.

실습 산술 연산(덧셈,뺄셈)

> x=c(2,1,0,-1)
> x+1                   #산술 연산: 덧셈
[1] 3 2 1 0
> x-1                    #산술 연산: 뺄셈
[1]  1  0 -1 -2

 

실습 산술 연산(곱셈,나눗셈,제곱)

> x=c(2,1,0,-1)
> 2*x                       #산술 연산: 곱셈
[1]  4  2  0 -2
> x/2                       #산술 연산: 나눗셈
[1]  1.0  0.5  0.0 -0.5
> x^2                       #산술 연산: 제곱
[1] 4 1 0 1


실습 관계 연산

> x=c(2,1,0,-1)
> x>0                          #관계 연산
[1]  TRUE TRUE FALSE FALSE
> x>0 & x<=1                  #논리 연산
[1] FALSE  TRUE FALSE FALSE


실습 함수 사용하기

> x=c(2,1,0,-1)
> log(x)                            #로그 함수 사용
[1] 0.6931472    0.0000000      -Inf       NaN
> exp(x)                            #지수 함수 사용
[1] 7.3890561 2.7182818 1.0000000 0.3678794

길이가 같은 두 벡터의 연산은 직접 연산자를 사용할 수 있다.

실습 길이가 같은 두 벡터의 덧셈과 뺄셈

> x=c(0,1,1), y=c(2,-1,1)
> x+y
[1] 2 0 2
> x-y
[1] -2  2  0


실습 길이가 같은 두 벡터의 곱셈과 나눗셈

> x=c(0,1,1), y=c(2,-1,1)
> x*y
[1]  0 -1  1
> x/y
[1]  0 -1  1


실습 길이가 같은 두 벡터의 거듭제곱((x,y,z)^(a,b,c)=(x^a, y^b, z^c))

> x=c(0,1,1), y=c(2,-1,1)
> x^y
[1] 0 1 1

 


11. 벡터의 속성들

벡터의 속성은 
• 자료의 유형: mode 
• 길이: length 
• 자료의 이름: names      가 있다. 

두 자료벡터 x=c(x1=2, x2=1, x3=0, x4=-1, x5=3)와 a=c(a1='kim', a2='lee', a3='park', a4='choi')의 속성을 알아보자.

실습 속성 확인하기

> x=c(x1=2, x2=1, x3=0, x4=-1, x5=3) 
> a=c(a1='kim', a2='lee', a3='park', a4='choi')
> x  
x1 x2 x3 x4 x5 
 2  1  0 -1  3 
> a
    a1     a2     a3     a4 
 "kim"  "lee" "park" "choi" 
> #자료의 유형을 알아보자.
> mode(x)
[1] "numeric"                 # 수치형 자료임을 말함.
> mode(a)
[1] "character"                # 문자형 자료임을 말함.
> #벡터의 길이 즉 자료의 개수를 알아보자.
> length(x)
[1] 5
> length(a)
[1] 4


실습 원소의 이름 확인하기

> names(x)
[1] "x1" "x2" "x3" "x4" "x5"
> names(a)
[1] "a1" "a2" "a3" "a4"

 

'언어 > R' 카테고리의 다른 글

[R-007] 외부 데이터 불러오기, 저장하기  (0) 2023.04.12
[R-006] 데이터 프레임(Data Frame)  (0) 2023.04.04
[R-004] R 기본 문법  (0) 2023.03.29
[R-003] 데이터 구조, 벡터 1  (0) 2023.03.29
[R-002] R, RStudio 설치하기  (0) 2023.03.28

댓글