[R] 연습

[R] dplyr 패키지 활용하기 (3편)

Simon Yoon 2021. 11. 29. 03:44

1편과 2편에서 다루었던 함수들은 총 4개이다.

1) 데이터프레임에서 특정 조건에 맞는 행을 추출하고 싶다면 filter()함수를 사용하자.

2) 데이터프레임에서 특정 열만 추출하고 싶다면 select()함수를 사용하자.

3) 데이터프레임에서 오름차순 정렬은 arrange() 함수를, 내림차순 정렬은 arrange(desc()) 함수를 사용하자.

4) 데이터프레임에서 파생변수 추가는 mutate() 함수를 사용하자.

 

이번 포스팅에서는 지정된 변수로 그룹화하는 방법과 요약 통계량 출력을 연습해보고 which() 함수도 사용해 볼 것이다.

항상 그렇지만 지난 내용과 직접적으로 언급하지 않은 함수나 과정이 포함될 수도 있다.

오늘은 새로운 Cereal 데이터를 사용해 볼 것이다. (첨부파일)

Cereals.csv
0.00MB
Cereal.csv 데이터의 일부


Q. 특정 변수를 기준으로 데이터를 요약하고 싶다면?

A. group_by() 함수 summarise() 함수 사용하자.

 

예를 들어, Cereal 데이터셋에서 시리얼 종류(type)별로 칼로리(calories) 평균에 차이가 있는지 알고 싶은 경우가 있을때 이러한 방법을 사용할 수 있다.

cereal <- read.csv("Cereals.csv")
library(dplyr)
cereal %>% 
  group_by(type) %>%
  summarise(cal_mean = mean(calories))

 

그럼 아래와 같은 결과를 얻을 수 있다.

 

코드 실행 결과

 

 

★ 예시문제1)

cereal 데이터 셋에서 제조사(mfr) 별로 나트륨(sodium) 함량 평균을 구하고, 평균 나트륨의 최대값에서 최소값을 뺀 결과를 출력하고, 가장 나트륨이 많이 들어간 제조사를 구하시오.

 

예시답안)

y <- cereal %>% 
  group_by(mfr) %>% 
  summarise(sodium_mean = mean(sodium))
max(y$sodium_mean) - min(y$sodium_mean)
y$mfr[which.max(y$sodium_mean)]

 

실행결과)



 

★ 예시문제 2)

cereal 데이터에서 제조사(mfr) 별로 분류하고, 각 제조사 시리얼 중에서 다시 종류(type)으로 나누어, 각 그룹별 평균 칼로리와 몇 개의 시리얼 제품이 있는지 통계량을 계산하시오.

 

예시답안)

cereal %>%
  group_by(mfr, type) %>%
  summarise(cal_mean = mean(calories),
            n = n())

 

실행결과)

코드 실행 결과

# 제조사(mfr) 에서도 서로 다른 종류(type)이 존재할 경우, N사 처럼 잘 나눠져서 통계량을 산출한 것을 확인할 수 있다.


'예시문제1' 에서 which.max() 함수를 사용하였는데, 여기서 which() 함수에 대해 추가로 다루도록 하겠다.

 

Q. 특정 조건에 맞는 값의 위치를 알고 싶다면?

A. which() 함수를 사용하자.

 

위 결과 화면과 같은 데이터에서 sodium_mean 값이 100 이상인 데이터를 알고 싶다고 하자.

물론 이전 포스팅에서 다루었던 filter() 함수를 사용할 수도 있지만, 지금은 각 데이터의 위치를 알고 싶은 경우라고 해보자.

 

which(y$sodium_mean >= 100)
# 결과 [1] 2 3 5 7

 

위치를 알게 되었으니 우리는 조건에 맞는 제조사(mfr)만 따로 출력할 수 있다.

 

y$mfr[which(y$sodium_mean >= 100)]
# 결과 [1] "G" "K" "P" "R"

 

★ 예시문제2)

cereal 데이터에는 여러 시리얼 제조사(mfr)가 들어있다. 이 데이터셋에서 가장 많은 시리얼 제조사가 어디인지를 구하시오.

 

예시답안)

 

mfr_table <- table(cereal$mfr)
names(mfr_table)[which(mfr_table == max(mfr_table))]
# 결과 [1] "K"

 

참고로 R을 이용해서 데이터의 최빈값을 찾을 때도 이와 같은 방식을 사용할 수 있다.

 

which() 함수는 which.min()으로 최소값의 위치를 찾을 수도 있으며, which.max()최대값의 위치도 찾을 수 있다.

따라서 방금 예시 답안을 다르게 쓰자면, 다음과 같이 작성할 수 있다.

 

mfr_table <- table(cereal$mfr)
names(mfr_table)[which.max(mfr_table)]
# 결과는 동일하게 [1] "K" 가 출력된다.

 

사실 추가로 sapply를 활용한 요약 통계량 코드도 다뤄보려고 했으나 생각보다 글이 길어져서 다음에 다루도록 하겠다.

 

 

※ 참고: 코드 예시는 해당 함수를 활용하기 위한 방법으로 제시한 것입니다. 따라서 다른 방법이 존재할 수 있습니다.