×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,426,999명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
강현대 : 5000원(busyhuman)
익명 : 5000원(알고리즘 학습러)

replicate 함수를 알아보자.


replicate() 함수는 반복문의 내용(expr)을 두 번째 인자에 부여하고, 

첫 번째 인자에 반복횟수를 넣어줌으로써 반복 실행된 코드의 결과를 벡터형태로 반환시켜주는 편리한 함수이다.


replicate(반복횟수, 반복시킬 함수)


> replicate(6, c(1:10))

      [,1] [,2] [,3] [,4] [,5] [,6]

 [1,]    1    1    1    1    1    1

 [2,]    2    2    2    2    2    2

 [3,]    3    3    3    3    3    3

 [4,]    4    4    4    4    4    4

 [5,]    5    5    5    5    5    5

 [6,]    6    6    6    6    6    6

 [7,]    7    7    7    7    7    7

 [8,]    8    8    8    8    8    8

 [9,]    9    9    9    9    9    9

[10,]   10   10   10   10   10   10


위의 상태를 보면 알 수 있듯이 6번 반복하는데 벡터 1~10을 출력해준다.

이때 class를 해보면 matrix임을 알 수 있다.



sample을 알아보자.


> sample(1:10)

 [1] 10  7  6  3  8  1  9  4  5  2

한번 뽑았던 것은 다시 뽑지 않는 방식으로 1~10의 수중 하나를 뽑아준다.

:: 비복원 추출


> sample(1:10, rep = T)

 [1] 1 6 5 9 1 9 6 2 4 7

한번 뽑았던 것도 또 뽑을 수 있도록 해주는 방식으로 1~10의 수중 하나를 뽑아준다.

:: 복원 추출


> sample(1:10, 3, rep = T)

[1] 9 8 5

1~10의 수 중 3개를 복원 추출로 해준다.



이제 아래 replicate와 sample을 조합해보자.


> replicate(6, sample(c(1:10)))

      [,1] [,2] [,3] [,4] [,5] [,6]

 [1,]    5   10    3   10    9    2

 [2,]    8    3    8    2    1   10

 [3,]    7    8    2    4    4    3

 [4,]    1    4    6    8    7    7

 [5,]    2    6   10    6    8    6

 [6,]    4    9    9    1    6    9

 [7,]    6    2    4    5   10    8

 [8,]    3    7    1    3    2    1

 [9,]   10    5    5    7    5    4

[10,]    9    1    7    9    3    5


6번 반복할건데 1~10의 수를 비복원 추출해달라는 의미이다.



> replicate(6, sample(1:5, 7, rep = T))

     [,1] [,2] [,3] [,4] [,5] [,6]

[1,]    1    2    1    2    5    3

[2,]    5    2    3    4    1    5

[3,]    5    1    1    2    1    4

[4,]    2    2    5    4    2    4

[5,]    1    2    3    1    4    1

[6,]    5    5    4    4    2    4

[7,]    4    2    4    1    1    2


6번 반복할건데 1~5의 수중 7개를 비복원 추출 해달라는 의미이다.



> a <- data.frame(replicate(6, sample(1:5, 7, rep = T)))

> a

  X1 X2 X3 X4 X5 X6

1  1  4  1  4  5  3

2  3  3  1  4  5  3

3  1  4  3  2  3  1

4  2  5  5  3  2  5

5  3  2  5  3  1  5

6  2  2  4  1  4  4

7  4  2  2  2  5  1


> names(a) <- letters[1:6]

> a

  a b c d e f

1 1 4 1 4 5 3

2 3 3 1 4 5 3

3 1 4 3 2 3 1

4 2 5 5 3 2 5

5 3 2 5 3 1 5

6 2 2 4 1 4 4

7 4 2 2 2 5 1


위의 내용을 데이터 프레임으로 바꾸기 위해 data.frame(~~)를 해주고, 


이름 설정을 위해 edit 혹은 names를 해준다.



데이터 프레임 응용해보기


> df <- data.frame(replicate(6, sample(c(1:10, -99), 7, rep = TRUE)))

> df

  X1  X2 X3 X4 X5  X6

1  4   2 10  4  7   6

2  4   8  2  2  9   3

3  4   2  7  9 10   7

4 10 -99  2  2  3 -99

5  4   7  7  9  4   3

6  5   4  1  6  9  10

7  5   9  4  5  1   2


> names(df) <- letters[1:6]

> df

   a   b  c d  e   f

1  4   2 10 4  7   6

2  4   8  2 2  9   3

3  4   2  7 9 10   7

4 10 -99  2 2  3 -99

5  4   7  7 9  4   3

6  5   4  1 6  9  10

7  5   9  4 5  1   2


> df$b[df$b == -99] <- NA

> df

   a  b  c d  e   f

1  4  2 10 4  7   6

2  4  8  2 2  9   3

3  4  2  7 9 10   7

4 10 NA  2 2  3 -99

5  4  7  7 9  4   3

6  5  4  1 6  9  10

7  5  9  4 5  1   2


df에 6번 반복하되 1~10 수 혹은 -99중 7개를 복원 추출하여 생성해준다. 


그리고 그를 data.frame으로 만들어주고 이름을 names로 넣어준다.


마지막에 df$b[df$b == -99] <- NA라는 의미는 df의 b이름에 해당하는 열에 -99가 있다면 NA로 변경하라는 의미이다.