본문 바로가기
언어/R

[R-008] R패키지 - 데이터 핸들링(dplyr)

by 천왕지짐 2023. 4. 15.
R의 장점은 수많은 패키지(Package)가 아닐까 생각한다.  패키지는 함수들을 모아놓은 것으로 R 패키지는 데이터를 읽어들이는데 도움을 주는 패키지, 데이터를 다루는데 도움을 주는 패키지, 데이터를 시각화하는데 도움을 주는 패키지, 데이터로 보고서를 만들어 주는 패키지 등 매우 다양하게 준비되어 있다. 몇몇 패키지들에 대해 알아보자.

 

패키지는 CRAN(http://cran.r-project.org)의 Packages에서 확인해 볼 수 있다.

 

패키지 설치하기

dplyr 패키지를 설치한다고 가정아래 패키지를 설치하고 패키지를 불러오자.

install.packages('dplyr')     # 패키지 설치, Rstudio에 한번 설치하면 다음에 다시 사용하기 위해 또 설치할 필요는 없다.
library(dplyr)     # 설치된 패키지를 불러올 때 사용한다.

 

 

설치된 패키지 확인 및 삭제하기

Rstudio에 설치된 모든 패키지를 확인하고 싶으면 library() 처럼 입력하면 된다.

삭제하고자 할 때는 remove.packages("패키지명") 처럼 입력하면 된다.

 

설치된 패키지에 어떤 함수들이 있는 지 확인하기

help(package = "패키지 이름")

예를 들어 help(package = "dplyr") 처럼사용한다.

 

설치된 패키지의 내장 데이터를 확인하기

패키지를 익히기 위해 별도의 데이터를 구할 필요는 없을 듯 하다. 아래에 내장 데이터가 무엇이 있는 지 확인하고 쓰면 되기 때문이다.

data_list = data(package=.packages(all.available = TRUE))
data_list     # 설치된 패키지의 모든 내장 데이터의 목록이 나타남
data_list$results[data_list$results[,"Package"] == "dplyr", ]       # dplyr의 내장 데이터(Item) 확인



View(starwars)      # 확인해 보자
View(storms)      # 확인해 보자

Rstudio 창에서도 확인이 가능하다.

 

위에서 설치한 데이터를 핸들링하는 dplyr 패키지에 대해서 알아보자. dplyr패키지는 tidyverse의 하위 패키지 중 하나이다. tidyverse 하위에는 많은 패키지들이 포함되어 있는데 굳이 다 사용하지 않을거면 tidyverse를 설치할 필요는 없을 듯 하고 필요한 것만 설치하는 것이 좋을 듯 하다.

 

dplyr패키지에는 데이터프레임을 조작할 수 있는 함수가 있으며 group_by()와 summarize()함수를 이용하여 요약할 수 있고 논리 필터링 연산을 사용하여 데이터 일부를 분석할 수 있다.

 

dplyr     # 패키지명을 입력한 후 커서가 그 위치에 있는 상태에서 F1을 눌러보자.

오른쪽  https://dplyr.tidyverse.org에서 확인해보면 사용법을 익힐 수 있다.

 

특히 사이트에서 제공하고 있는 치트 시트(Cheat Sheet)를 확인해 보면 거의 완벽하게 이해할 수 있게 될 것이다.

 

dplyr의 함수
● select() : 데이터프레임에서 열(column)을 추출한다.
● filter() : 지정한 조건에 따라 행(row)을 추출한다.
   주의할점은 연산순서에 따라 결과가 달라진다.
● mutate() : 기존 칼럼값을 활용하여 새로운 칼럼을 생성할때, 파생변수를 만들거나 기존 변수를 변환할 때 사용한다.
● arrange() : 작은 값으로부터 큰 값의 순으로 데이터를 정렬 할 때 사용한다. -> 열지정

● summarize() : 요약함수로서 mean(), sd(), var(), median() 등의 함수를 지정하여 기초 통계량을 보여준다.

● group_by() : 데이터에서 특정 컬럼을 지정해서 그룹 별로 묶을 수 있다. select()와 다른점은 그룹여부이다.

 

 

아래 실습에서 사용하고 있는 startwars 데이터프레임은 dplyr패키지에 내장되어 있는 데이터셋이다.

 

실습 select()

데이터프레임에서 열을 추출한다. 열은 name, height, mass, hair_color, skin_color, eye_color, birth_year 등으로 구성되어 있다. 이름, 키, 문자열의 끝 부분이 특정한 문자열 패턴으로 끝나는지 즉, "color"로 끝난 열을 추출해보자.

starwars     # 데이터프레임의 내용을 확인해 보자.  View(starwars)도 좋겠다. 앞에서 library(dplyr)을 하지 않았다면 해야 한다.
starwars %>% select(name, height, ends_with("color"))     # name:mass와 같이 콜론을 사용할 수도 있다.

%>% 는 파이프라인 연산자(pipe operator)라 하며 함수를 연속적으로 적용하는 작업을 간결하게 표현할 수 있도록 도와준다. 왼쪽에 있는 결과를 오른쪽의 함수로 전달하는 역할을 한다. 만약 파이프라인 연산자를 사용하지 않을 경우에는 다음과 같이 사용할 수 있다.

select(starwars, name, height, ends_with("color"))     # 또는 select(starwars, name, height, hair_color, skin_color, eye_color)

직접 변수 이름을 지정하는 방식은 파이프라인 연산자를 사용하는 것보다 코드가 길어지고 가독성이 떨어질 수 있으므로, 가능하다면 파이프라인 연산자를 사용하는 것이 좋다.

 

 

실습 filter()

데이터프레임에서 행을 추출한다. 눈의 색깔이 빨간색인 경우만 찾아보자.

starwars %>% filter(eye_color == "red")     # filter(starwars, eye_color == "red") 처럼 써도 동일하다.

filter(starwars, eye_color =="red")     # 파이프라인 연사자를 사용하지 않는 경우에 이렇게 사용될 수 있다.

 

 

실습 mutate()

기존 칼럼값을 활용하여 새로운 칼럼을 생성해보자. bmi 열은 체질량 지수(Body Mass Index, BMI)를 의미한다. BMI는 인간의 체질량과 키를 이용하여 비만 정도를 측정하는 지수로, 체중(kg)을 키(m)의 제곱으로 나누어 계산한다. 따라서 mutate() 함수의 두 번째 인자에서 mass / ((height / 100) ^ 2)를 계산하여 bmi 열에 추가합니다.

starwars %>% 
  mutate(bmi = mass / ((height / 100)  ^ 2)) %>%
  select(name:sex, bmi)

파이프라인 연산자가 사용되지 않았다면 아래와 같이 사용될 수 있다.

starwars <- mutate(starwars, bmi = mass / ((height / 100)  ^ 2))
select(starwars, name:sex, bmi)

 

실습 arrange()

열을 지정하여 데이터를 정렬해보자. 

starwars %>% arrange(desc(height))     # 키를 역순(내림차순)으로 정렬해보자. 

파이프라인 연산자가 사용되지 않았다면 아래와 같이 사용될 수 있다.

arrange(starwars, desc(height))     # desc를 생략하면 오름차순이므로 굳이 asc를 사용할 필요가 없고 사용하면 에러가 난다.

 

 

실습 group_by()

데이터에서 특정 컬럼을 지정해서 그룹 별로 묶어 보자. starwars 데이터 프레임을 species 열을 기준으로 그룹화하고, 각 그룹별로 n과 mass를 계산한 후, n이 1보다 크고 mass가 50보다 큰 그룹만 선택하여 출력하는 코드를 작성해보자.

starwars %>%
  group_by(species) %>%
  summarise(
    n = n(),
    mass = mean(mass, na.rm = TRUE)
  ) %>%
  filter(
    n > 1,
    mass > 50
  )

먼저 group_by(species)를 사용하여 species 열을 기준으로 데이터를 그룹화한다. 그 다음 summarise() 함수를 사용하여 각 그룹별로 n과 mass를 계산한다. n() 함수는 그룹의 행 수를 계산하며, mean(mass, na.rm = TRUE)는 mass 열의 평균값을 계산합니다. na.rm = TRUE는 결측값이 있는 경우 해당 값을 제외하고 계산하라는 의미이다.

다음으로 filter() 함수를 사용하여 n > 1과 mass > 50인 그룹만 선택한다. 이는 n이 1보다 크고, mass가 50보다 큰 종(species)만 선택하라는 의미입니다.

따라서 이 코드는 starwars 데이터 프레임에서 species 열을 기준으로 그룹화한 후, 각 그룹별로 n과 mass를 계산하고, n이 1보다 크고 mass가 50보다 큰 종만 선택하여 출력하는 코드이다.

 

파이프라인 연산자가 사용되지 않았다면 아래와 같이 사용될 수 있다.

grouped_starwars <- group_by(starwars, species)
summarised_starwars <- summarise(grouped_starwars, n = n(), mass = mean(mass, na.rm = TRUE))
filtered_starwars <- filter(summarised_starwars, n > 1, mass > 50)
filtered_starwars

 

'언어 > R' 카테고리의 다른 글

[R-010] ggplot2 - geom_point()  (0) 2023.05.03
[R-009] 패키지 - 데이터 시각화  (0) 2023.04.16
[R-007] 외부 데이터 불러오기, 저장하기  (0) 2023.04.12
[R-006] 데이터 프레임(Data Frame)  (0) 2023.04.04
[R-005] 벡터(Vector) 2  (0) 2023.03.29

댓글