[R] 누적 합(cumulative sums) : cumsum(), 누적 곱(cumulative products) : cumprod(), 누적 최소값(cumulative minima) : cummin(), 누적 최대값(cumulative maxima) : cummax()
R 분석과 프로그래밍/R 데이터 전처리 2016. 8. 30. 23:57이번 포스팅에서는 누적(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() 함수를 이용해서 계산하면 아래와 같습니다.
|
이를 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 )를 참고하세요.
이번 포스팅이 도움이 되셨다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^