ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 수열생성(벡터생성)
    R/Contents 2022. 4. 17. 05:11

    벡터를 만드는 방법 중의 하나는 수열을 생성하는 것인데 수열을 생성하는 방법에 대해서 살펴보고자 한다.

     

    우선, 0부터 10까지의 수열을 생성해보면 아래와 같다. 0부터 10까지의 수열을 생성한 후 a에 할당하였다. 그리고 난 후 a를 입력한 후 실행시키면 0부터 10까지 생성된 수열이 나온다. 

    a <- 0:10
    a
    ### result
    [1]  0  1  2  3  4  5  6  7  8  9 10

    그럼, 역으로 20부터 7까지의 수열을 생성해보았다.

    b <- 20:7
    b
    ### result
    [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7

    위에서 살펴본 두가지 예의 공통점은 1씩 증가하거나 1씩 감소한 것인데 우리는 얼마씩 증가하게 할 것인지, 아니면 감소하게 할 것인지 결정할 수 있다. 기본 구조는 seq(초기값, 최종값, 증가/감소값)이다.

     예를 들어, 0부터 18까지 2씩 증가하는 수열을 만들어보면, seq(from=0, to=18, by=2)가 된다. 여기서 from, to, by는 명령어에서 빼줘도 동일한 결과 값을 얻는다.

    c <- seq(0, 18, 2)
    c
    ### result
    [1]  0  2  4  6  8 10 12 14 16 18

    이와 반대로 18부터 0까지 2씩 감소하는 수열을 만들어보면, seq(from=18, to=0, by=-2)가 된다.

    e <- seq(18, 0, -2)
    e
    ### result
    [1] 18 16 14 12 10  8  6  4  2  0

    이번에는 기존에 이미 생성해 놓은 벡터가 있다고 가정하고, 그 벡터의 길이에 맞는 새로운 벡터를 생성하고자 할 때 유용하게 쓰일 수 있는 along, length 명령어에 대해서 살펴보고자 한다. 예를들어, 기존에 벡터 v <- c(35,34,37,39,43,46,47,51,55,59,67,68)이 있다고 가정하자. 기존 벡터의 길이에 맞게 0.37부터 시작하는 값을 갖고 0.01씩 증가하는 벡터를 생성하면 seq(from=0.37, by=0.01, length=12)를 입력해주면 된다. length=12인 이유는 벡터 v가 12개의 값을 가지고 있기 때문이다.

    v <- c(35,34,37,39,43,46,47,51,55,59,67,68)
    
    a <- seq(from=0.37, by=0.01, length=12)
    a
    ### result
     [1] 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48

    우리가 벡터의 length 값을 구하기 쉽지 않을 때 along을 쓰면 되는데 seq(0.37, by=0.01, along=v)를 입력해주면 된다. v는 앞서 생성한 벡터이다. 

    b <-seq(0.37, by=0.01, along=v)
    b
    ### result
    [1] 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48

    만약 증가 또는 감소가 되는 값과 상관없이 0.37부터 특정값까지 v 벡터 갯수만큼의 숫자를 생성하라고 한다면, seq(from=0.37, to=원하는 값, along=v)를 입력하면 된다. 예를들어 0.37부터 1.05까지 v벡터와 동일한 길이의 벡터를 생성하라고 한다면, 

    c <- seq(from=0.37, to=1.05, along=v)
    c
    ### result
     [1] 0.3700000 0.4318182 0.4936364 0.5554545 0.6172727 0.6790909 0.7409091
     [8] 0.8027273 0.8645455 0.9263636 0.9881818 1.0500000

    다음으로 반복생성이다. 

    만약, 7이라는 숫자를 네개 생성하라고 한다면 rep(7,4) 를 입력하면 된다.

    a <- rep(7,4)
    a
    ### result
    [1] 7 7 7 7

    또 다른 예를 살펴보면, 1:6까지 생성하되 이것을 두 번 반복해서 생성하려고 한다면, rep(1:6, 반복횟수)를 입력하면 된다. 아래 결과에서 알 수 있듯이 1부터 6까지 생성한 다음 입력한 반복 횟수 만큼 1부터 6까지 더 생성한다.

    b <- rep(1:6, 2)
    b
    ### result
     [1] 1 2 3 4 5 6 1 2 3 4 5 6

    똑같은 반복인데 위와 조금 다른 경우가 있다. 위에서는 1부터 6까지 생성한 후 이것을 반복한 것인데 이와 달리 각각의 숫자를 반복하는 것이다. 그래서 each= 가 추가되면 각각의 숫자를 반복해서 벡터를 만들게 된다. 

    c <- rep(1:6, each=2)
    c
    ### result
    [1] 1 1 2 2 3 3 4 4 5 5 6 6

    결과적으로 1을 두 번, 2를 두 번, 3을 두 번...6을 두 번 생성한 벡터가 만들어진 것을 볼 수 있다.

     

    만약, 위에서 생성한 벡터를 원하는 횟수만큼 반복해서 만들고 싶다면 rep(1:6, each=2, times=횟수)를 입력해주면 된다. 

    d <- rep(1:6, each=2, times=4)
    d
    ### result
     [1] 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6
    [36] 6 1 1 2 2 3 3 4 4 5 5 6 6

    만약 1에서 5까지의 숫자를 1은 1개, 2는 2개, 3은 세개, 4는 네가, 5는 다섯개를 생성하여 벡터를 만들고 싶다면, rep(1:5, 1:5)를 입력해주면 된다. 앞의 1:5는 1부터 5까지 만들라는 의미고, 뒤의 1:5는 각각에 대응하는 값의 횟수를 의미한다.

    e <- rep(1:5, 1:5)
    e
    ### result
    [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

    만약 각각의 반복할 횟수를 불규칙하게 정해주고 싶다면, 1:5 대신에 c(횟수1, 횟수2, 횟수3, 횟수4, 횟수5)를 넣어주면 된다. 우리 예에서는 1은 두 번, 2는 세 번, 3은 두 번, 4는 다섯 번, 5는 한 번만 반복해서 생성하였다.

    a <- rep(1:5, c(2,3,2,5,1))
    a
    ### result
    [1] 1 1 2 2 2 3 3 4 4 4 4 4 5

    위의 예는 문자형 데이터에서도 가능하다. 

    b <- rep(c("ford", "toyota", "chevy", "honda", "BMW"), c(2,3,2,5,1))
    b
    ### result
     [1] "ford"   "ford"   "toyota" "toyota" "toyota" "chevy"  "chevy" 
     [8] "honda"  "honda"  "honda"  "honda"  "honda"  "BMW"

    마지막으로 generate levels을 의미하는 gl에 대해서 살펴보고자 한다. 기본 구조는 gl(최대값, 반복횟수, 전체 길이)이다. 예를 들어 최대값을 6으로 하고 반복을 2번 하라고 한다면, gl(6,2)를 입력해주면 된다. 

    a <- gl(6,2)
    a
    ### result
     [1] 1 1 2 2 3 3 4 4 5 5 6 6
    Levels: 1 2 3 4 5 6

    위의 값은 전체길이가 12인데 gl(6,2,12)와 같은 의미이다. 그런데 만약, 전체길이가 딱 맞아 떨어지지 않는다면 어떻게 되는지 살펴보았다. 전체길이가 13인 경우와 전체길이가 18인 경우를 살펴보았다. 결과를 보면 전체 길이 수 만큼만 반복되어 생성된 것을 알 수 있다. 전체 길이가 13인 경우 1부터 6까지 두 개씩 생성 한 후 1을 한 개 추가함으로써 13이라는 전체 길이숫자를 맞췄고, 전체길이가 18인 경우 1 두개, 2두개, 3두개를 추가로 더 생생한 것을 볼 수 있다. 

    ### 전체 길이가 13인 경우
    b <- gl(6,2,13)
    b
    ### result
    [1] 1 1 2 2 3 3 4 4 5 5 6 6 1
    Levels: 1 2 3 4 5 6
    
    ### 전체 길이가 18인 경우
    c <- gl(6,2,18)
    c
    ### result
     [1] 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3
    Levels: 1 2 3 4 5 6

    마지막으로 숫자가 아닌 문자형인 경우 labels=c("",""...)를 추가해주면 된다. 예를 들어, 난이도를 나타내는 easy, moderate, hard를 4번 반복하고 총 12개를 생성하라고 한다면, 요인수는 easy, moderate, hard 즉 세개이고, 반복은 네 번, 전체 길이는 12가 된다. 그러므로 gl(3, 4, 12, labels=c("easy", "moderate", "hard"))를 입력해주면 된다. 참고로 여기서 diff는 임의로 생성한 벡터명이다. 

    diff <- gl(3,4,12, labels=c("easy", "moderate", "hard"))
    diff 
    ###result
     [1] easy     easy     easy     easy     moderate moderate moderate
     [8] moderate hard     hard     hard     hard    
    Levels: easy moderate hard

    댓글

Designed by Tistory.