[R] 새로운 컬럼에 행 평균값 계산하여 넣기

해당 포스트에서는 R에서 행 평균값을 계산하여 새로운 컬럼에 저장하는 방법을 소개합니다.

1. INTRO

R에는 평균을 계산해 주는 mean() 기본 함수가 있습니다. 벡터 또는 리스트 내의 평균을 계산하는 경우는 mean() 함수로 간단히 해결할 수 있지만, 행 별로 평균을 계산해야 하는 경우는 다른 풀이가 필요합니다.

아래에서는 네이버 지식인에 올라온 질문을 기반으로 tibble()data.frame() 구조에서 행별 평균을 구하는 방법을 설명드리겠습니다.

▲ 네이버 지식인 질문

2. 문제 풀이

tibble 사용하기

데이터 생성

먼저 질문자가 제시한 표를 데이터(mydata)로 생성해 보겠습니다. 참고로 아래 내용에 dplyr 문법이 언급된 것이 보이니 tibble() 구조로 생성하겠습니다.

library(tidyverse)

mydata <- tibble(
  이름  = c("김철수", "김영희", "박영수"),
  수학  = c(50, 58, 65),
  과학  = c(46, 58, 87),
  영어  = c(13, 74, 13)
)
mydata
# A tibble: 3 x 4
  이름    수학  과학  영어
      
1 김철수    50    46    13
2 김영희    58    58    74
3 박영수    65    87    13


문제에서 제시한 데이터와 동일한 구조의 데이터가 생성되었습니다. 이제 각 행(이름) 별로 평균을 계산하고 새로운 컬럼을 만들어 저장해 보겠습니다.

새로운 컬럼에 평균값 저장

dplyr 패키지에서는 새로운 컬럼을 생성하여 데이터를 저장할 수 있도록 mutate() 함수를 제공하고 있습니다. 자세한 설명은 dplyr 공식 페이지 에서 확인할 수 있으며, 이번 포스트에서는 문제 풀이에 필요한 부분만 다루겠습니다.

mutate()함수는 'mutate(새로운컬럼명 = 계산식)'으로 간단하게 사용할 수 있으며 이번 문제에서는 새로운 컬럼명에 '평균'을 넣고 계산식에 '(수학+과학+영어)/3'를 입력하면 됩니다. 이 내용을 코드로 보면 아래와 같습니다.

mydata_add_mean <- mydata %>% 
  mutate(평균 = (수학+과학+영어)/3)

mydata_add_mean
# A tibble: 3 x 5
  이름    수학  과학  영어  평균
       
1 김철수    50    46    13  36.3
2 김영희    58    58    74  63.3
3 박영수    65    87    13  55

출력 결과를 보면, 계산식이 정상적으로 계산되어 새로운 컬럼인 평균에 저장된 것을 볼 수 있습니다.

dplyr 패키지를 사용하지 않는다면?

위 풀이는 dplyr 패키지를 사용한 풀이로, 질문자 분이 요청에 맞춰 작성되었습니다. 그러나 초심자 분들은 tidyversetibble() 자료 구조보다 기본 구조인 data.frame이 더 익숙하실 거라 생각됩니다.

데이터 생성

데이터는 위에서 생성한 mydatadata.frame()로 변경하여 사용하겠습니다.

mydata2 <- as.data.frame(mydata)
mydata2
    이름 수학 과학 영어
1 김철수   50   46   13
2 김영희   58   58   74
3 박영수   65   87   13

tibble() 구조의 데이터를 as.data.frame() 함수를 이용해 데이터 프레임 구조로 변경하여 mydata2 변수에 저장하였습니다.
출력 결과를 보면 tibble()과는 다르게 각 컬럼의 타입이 무엇인지 나타나지 않는 것을 볼 수 있습니다. 이 부분은 사소하지만 필요한 정보를 먼저 제공해 주는 tibble()이 좀 더 유용하다고 생각됩니다.

새로운 컬럼에 평균값 저장

위 풀이와 동일하게 '평균' 컬럼을 생성해 보겠습니다.

mydata2$평균 <- rowMeans(mydata2[,c('수학','과학','영어')])
mydata2

# 같은 결과
# mydata2$평균 <- (mydata2$수학 + mydata2$과학 + mydata2$영어)/3
# mydata2
    이름 수학 과학 영어     평균
1 김철수   50   46   13 36.33333
2 김영희   58   58   74 63.33333
3 박영수   65   87   13 55.00000

출력 결과를 보면 소수점 표현이 약간 다르지만 같은 결과가 출력된 것을 볼 수 있습니다.

위에서 사용한 rowMeans()함수는 2차원 배열을 가지는 데이터셋에서 행 평균을 구해주는 함수로, mydata2에서 '수학, 과학, 영어' 컬럼만 선택한 뒤 rowMeans()로 행 평균을 계산하여 '평균' 컬럼에 저장하였다고 생각하시면 됩니다.

3. 마무리

이번 포스트에서는 R에서 행평균을 계산하여 새로운 컬럼에 저장하는 방법을 설명하였습니다. 결과는 같더라도 과정은 다양할 수 있으며, 자신만의 스타일 또는 주어진 환경을 고려해 문제를 해결하시면 됩니다.

참고로 R은 한글 친화적인 언어가 아니다보니 한글을 변수명이나 데이터에 사용하는 경우 다양한 에러가 발생할 수 있습니다. 가능하다면 한글 변수명이나 데이터는 영어로 치환하여 작업하시는 것을 추천드립니다.

4. 관련링크

[1] tidyverse 공식페이지
[2] dplyr 공식페이지


banner-request-analysis