'Selecting rows which the RowSum is maximum per groups using R'에 해당되는 글 1건

  1. 2019.02.22 [R] 그룹 별 행 합이 최대인 행만 선별하기 (Selecting rows which the RowSum is maximum per groups)

이번 포스팅에서는 행 기준으로 숫자형 변수들의 합을 구한 다음에, 그룹별로 행 기준 합이 최대인 전체 행을 선별하는 방법을 소개하겠습니다. 


말로 설명한 내용만으로는 얼른 이해가 안 올 수도 있겠는데요, 이번에 해볼 내용은 아래의 이미지를 참고하시면 이해가 쉬울 듯 합니다. 




예제로 사용할 하나의 그룹 변수(V1)와 나머지 9개의 숫자형 변수(V2~V10)로 구성된 간단한 DataFrame을 만들어보겠습니다. 



> ##------------------------------------------------------

> ## selecting distinct object using dplyr chain operator

> ##------------------------------------------------------

> rm(list=ls())

> set.seed(123) # for reproducibility

> V1 <- c(rep("apple", 5), rep("banana", 5), rep("tomato", 5)) # group

> V2 <- sample(x=1:10, size=15, replace=T)

> V3 <- sample(x=1:10, size=15, replace=T)

> V4 <- sample(x=1:10, size=15, replace=T)

> V5 <- sample(x=1:10, size=15, replace=T)

> V6 <- sample(x=1:10, size=15, replace=T)

> V7 <- sample(x=1:10, size=15, replace=T)

> V8 <- sample(x=1:10, size=15, replace=T)

> V9 <- sample(x=1:10, size=15, replace=T)

> V10 <- sample(x=1:10, size=15, replace=T)

> df <- data.frame(V1, V2, V3, V4, V5, V6, V7, V8, V9, V10)

> df

       V1 V2 V3 V4 V5 V6 V7 V8 V9 V10

1   apple  3  9 10  2  7  3  2  9   7

2   apple  8  3 10  3  1  4  7 10   4

3   apple  5  1  7  5  4  7  4  7   4

4   apple  9  4  8  3  3  4  7  5   3

5   apple 10 10  1  9  9  2  4  2   4

6  banana  1  9  5  1  5  3  2 10  10

7  banana  6  7  8  5  9  7  8  4   2

8  banana  9  7  3  8  9  5  1  1   1

9  banana  6 10  4  2  8  8  5 10   2

10 banana  5  7  3  6  5  2  6  8   7

11 tomato 10  8  2  3  8  5  6  2   7

12 tomato  5  6  5  2  7 10  4  6   9

13 tomato  7  6  5  8  8  9  5 10   7

14 tomato  6  3  4  9  1  9 10  6   8

15 tomato  2  2  2  4  5  2  5  5   6

 

> rm(V1, V2, V3, V4, V5, V6, V7, V8, V9, V10)





rowSums() 함수를 사용하여서 행(row) 기준의 숫자형 변수들 모두에 대해 합계를 구하여 'V_sum' 이라는 새로운 변수를 추가해보겠습니다. 



> # summation in a row direction

> df$V_sum <- rowSums(df[,2:10])

> df

       V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V_sum


1   apple  3  9 10  2  7  3  2  9   7    52

2   apple  8  3 10  3  1  4  7 10   4    50

3   apple  5  1  7  5  4  7  4  7   4    44

4   apple  9  4  8  3  3  4  7  5   3    46

5   apple 10 10  1  9  9  2  4  2   4    51


6  banana  1  9  5  1  5  3  2 10  10    46

7  banana  6  7  8  5  9  7  8  4   2    56

8  banana  9  7  3  8  9  5  1  1   1    44

9  banana  6 10  4  2  8  8  5 10   2    55

10 banana  5  7  3  6  5  2  6  8   7    49


11 tomato 10  8  2  3  8  5  6  2   7    51

12 tomato  5  6  5  2  7 10  4  6   9    54

13 tomato  7  6  5  8  8  9  5 10   7    65

14 tomato  6  3  4  9  1  9 10  6   8    56

15 tomato  2  2  2  4  5  2  5  5   6    33

 




위의 행 기준 합계로 보면 'apple' 그룹에서는 1번째 행의 합이 52로 가장 크며, 'banana' 그룹에서는 7번째 행의 합이 56으로서 가장 크고, 'tomato' 그룹에서는 13번째 행의 합이 65로서 가장 큽니다. 이를 1번째, 7번째, 13번째 전체 행을 선별해보겠습니다. (빨간색으로 표시한 부분)



> library(dplyr)

> df_group_distinct_max <- df %>% 

+   arrange(V1, desc(V_sum)) %>% 

+   group_by(V1) %>% slice(1:1)

> df_group_distinct_max <- data.frame(df_group_distinct_max[1:10])

> df_group_distinct_max

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10

1  apple  3  9 10  2  7  3  2  9   7

2 banana  6  7  8  5  9  7  8  4   2

3 tomato  7  6  5  8  8  9  5 10   7

 


* dplyr 패키지 사용법은 

https://rfriend.tistory.com/234 , 

https://rfriend.tistory.com/236

참고하시기 바랍니다


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


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



Posted by R Friend R_Friend