이번 포스팅에서는 누적(cumulative)과 관련된 함수로서 {base} package에 기본으로 내장되어 있는 함수들인

 

 - 누적 합 (cumulative sums) : cumsum()

 

 - 누적 곱 (cumulative products) : cumprod()

 

 - 누적 최소값 (cumulative minima) : cummin()

 

 - 누적 최대값 (cumulative maxima) : cummax()

 

함수들에 대해서 아주 간단한 벡터(vector) 예제를 들어서 살펴보도록 하겠습니다.

 

이 함수들을 알고 있으면 달랑 한줄이면 끝인데요, 이 함수들을 모르고 있으면 누적 합, 누적 곱, 누적 최소값, 누적 최대값 구하는 프로그래밍하기가 은근히 어렵습니다. 

 

 

 

 

 

 

(1) 누적 합 (cumulative sums) : cumsum()

 

(1-1) 벡터 누적 합 (cumulative sum of vector)

 

아래와 같이 1~10까지의 정수 벡터가 있다고 합시다. 그리고 이에 대해 오른쪽으로 하나씩 이동해가면서 누적 합을 구해보면 아래의 표와 같습니다.

 

vector

1

2

3

4

5

6

7

8

9

 10

cumulative sums

1

3

6

10

15

21

28

36

45

55 

 

 

 

이걸 R base package의 cumsum() 함수를 이용해서 계산하면 아래와 같습니다.

 

> ##---------------------------------------------------------- > ## cumulative Sums, Products, and Minima or Maxima (Extremes) > ##---------------------------------------------------------- > # {base} package > > # (1) cumulative sums : cumsum() > # (1-1) cumulative sums (vector) : cumsum() > c(1:10) [1] 1 2 3 4 5 6 7 8 9 10 > > cumsum(1:10) [1] 1 3 6 10 15 21 28 36 45 55

 

 

 

 

이를 cumsum() 함수를 쓰지 않고 while 반복문을 사용해서 프로그래밍할 수도 있습니다.

(그런데, 계산 결과 제시되는 포맷이 위의 cumsum()과는 다르군요. ^^; )

 

> # cf. cumulative sums : while loop programing
> x <- 0
> i <- 1
> while( i <= 10) {
+         x = x + i
+         print(x) 
+         i = i + 1
+       }
[1] 1
[1] 3
[1] 6
[1] 10
[1] 15
[1] 21
[1] 28
[1] 36
[1] 45
[1] 55

 

 

 

누적 합(cumulative sums)은 그래도 종종 사용하는 만큼 벡터와 더불어서 데이터 프레임(dataframe) 예제도 곁들어서 살펴보겠습니다.

 

(1-2) 칼럼 1개만의 누적합을 구하는 방법과, (1-3) (numeric) 칼럼 모두의 누적합을 구하는 방법으로 나누어서 예를 들어보겠습니다.

 

 

(1-2) 데이터 프레임 : 변수 1개의 누적 합 (dataframe - cumulative sum of a column)

 

1~10까지의 정수인 x1 에 대한 누적합이므로 위의 (1-1) 벡터 예제와 결과가 동일하게 나옵니다.

결과 제시 포맷만 데이터 프레임의 새로운 변수(cum_sum_x1)로 생성된게 다를 뿐입니다.

 

> # (1-2) cumulative sums (dataframe - only 1 variable)
> #  : mydata$cum_sum <- cumsum(madata$var1)
> x1 <- c(1:10)
> x2 <- c(rep(1:5,2))
> x3 <- c(rep(2, 10))
> 
> x123 <- data.frame(x1, x2, x3) # making dataframe
> 
> x123
   x1 x2 x3
1   1  1  2
2   2  2  2
3   3  3  2
4   4  4  2
5   5  5  2
6   6  1  2
7   7  2  2
8   8  3  2
9   9  4  2
10 10  5  2
> 
> 
> x123$cum_sum_x1 <- cumsum(x123$x1) # cumulative sum of x1
> 
> x123
   x1 x2 x3 cum_sum_x1
1   1  1  2          1
2   2  2  2          3
3   3  3  2          6
4   4  4  2         10
5   5  5  2         15
6   6  1  2         21
7   7  2  2         28
8   8  3  2         36
9   9  4  2         45
10 10  5  2         55

 

 

 

 

(1-3) 데이터 프레임 : 숫자형 모든 변수의 누적 합 (dataframe - cumulative sum of all variables)

 

cumsum() 함수에 apply() 함수를 응용하면 소기의 목적을 달성할 수 있습니다. 

 

아래 예제의 1번째 행(row), 2번째 행, 3번째 행이 어떻게 구해졌는지만 풀어서 설명을 해보면요,

 

1st across_cum_sum = 1 + 1 + 2 + 1 = 5

2nd across_cum_sum = 5(1st across_cum_sum) + (2 + 2 + 2 + 3)(2nd row) = 14

3rd across_cum_sum = 14(2nd across_cum_sum) + (3 + 3 + 2 + 6)(3rd row) = 28

 

 

> # (1-3) cumulative sums (dataframe - all variables)
> #  : mydata$across_cum_sum <- cumsum(apply(mydata, 1, sum))
> x123$across_cum_sum <- cumsum(apply(x123, 1, sum))
> 
> x123
   x1 x2 x3 cum_sum_x1 across_cum_sum
1   1  1  2          1              5
2   2  2  2          3             14
3   3  3  2          6             28
4   4  4  2         10             48
5   5  5  2         15             75
6   6  1  2         21            105
7   7  2  2         28            144
8   8  3  2         36            193
9   9  4  2         45            253
10 10  5  2         55            325

 

 

 

(2) 누적 곱 (cumulative products) : cumprod()

 

1~10까지의 정수 벡터를 가지고 누적 곱 예를 들어보겠습니다.

숫자 하나씩 오른쪽으로 이동하면서 곱해나가면 됩니다. 

(아직 실전에서 써먹어 본적은 없음 -,-;)

 

> # (2) cumulative products (vector) : cumprod()
> c(1:10)
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> cumprod(1:10)
 [1]       1       2       6      24     120     720    5040   40320  362880 3628800

 

 

 

 

(3) 누적 최소값 (cumulative minima) : cummin()

 

정수 (3, 2, 1, 2, 1, 0, 4, 3, 2) 의 순서로 이루어진 벡터에 대해서 누적 최소값을 구해보겠습니다. 

오른쪽으로 하나씩 숫자를 이동하면서 과거 지나온 숫자를 기억하고 있다가, 매번 평가를 통해 가장 작은 값(cumulative minima)을 반환하게 됩니다.

 

> # (3) cumulative minima (vector) : cummin()
> c(3:1, 2:0, 4:2)
[1] 3 2 1 2 1 0 4 3 2
> 
> cummin(c(3:1, 2:0, 4:2))
[1] 3 2 1 1 1 0 0 0 0

 

 

 

 

(4) 누적 최대값 (cumulative maxima) : cummax()

 

정수 (3, 2, 1, 2, 1, 0, 4, 3, 2) 의 순서로 이루어진 벡터에 대해서 누적 최대값을 구해보겠습니다.

오른쪽으로 하나씩 숫자를 이동하면서 과거 지나온 숫자를 기억하고 있다가, 매번 평가를 통해 가장 큰 값(cumulative maxima)을 반환하게 됩니다.

 

> # (4) cumulative maxima (vector) : cummax()
> c(3:1, 2:0, 4:2)
[1] 3 2 1 2 1 0 4 3 2
> 
> cummax(c(3:1, 2:0, 4:2))
[1] 3 3 3 3 3 3 4 4 4

 

 

 

많은 도움 되었기를 바랍니다.

 

 

참고로, R dplyr 패키지의 Window funciton 중에서
 - Cumulative aggregates : cumall() 함수, cumany() 함수, cummean() 함수
에 대해서는 여기 ( ☞ http://rfriend.tistory.com/246 )를 참고하세요.

 

 

이번 포스팅이 도움이 되셨다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

 

Posted by R Friend R_Friend