-
수열생성(벡터생성)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
'R > Contents' 카테고리의 다른 글
scatter plot - 산점도 그래프 (0) 2023.10.22 R에서 특정 변수(혹은 특정 열)만 선택하기 (0) 2022.02.09 [R] 변수명 변경하기 (0) 2021.10.18 R 설치하기 (0) 2021.06.12 R에서 새로운 컬럼 혹은 변수 생성하고 값 부여하기 II (0) 2020.05.16