R 데이터프레임 다루기

  • R

준비

R에서 행과 열 형태로 이루어진 데이터프레임, 엑셀 스프레드시트 같은 걸 불러올 때는 readr, 불러온 데이터프레임을 다룰 때는 dplyr을 주로 사용한다. (참고로 dplyr와 readr 패키지는 모두 tidyverse라는 거대한 패키지의 일부라고 한다.)

라이브러리 불러오는 건 간단하다.

library(readr)
library(dplyr)

이제 본격적으로 데이터프레임 조작하는 방법을 익혀보자.


CSV 읽기, 쓰기 : read_csv(), write_csv()

csv로부터 데이터프레임을 읽을 때

df <- read_csv('my_csv_file.csv')

데이터프레임을 csv 형식으로 저장할 때

write_csv(df, 'new_csv_file.csv')

데이터프레임 탐색하기

head() 함수는 데이터프레임의 위에서부터 6개 행을 돌려준다. 더 많은 행을 보려면 괄호 안에 숫자 n을 전달하면 된다. 예를 들면 이렇게. head(df, 10).

str() 함수는 각 열에 포함된 값들의 유형(type)을 알려준다. 예를 들면 문자열인지 숫자인지.

summary() 함수는 숫자로 구성된 열(numeric column)에 대해서는 평균, 중앙값, 최소값 및 최대값과 같은 요약 통계를 돌려준다. 숫자가 아닌 열(non-numeric column)에 대한 클래스 및 길이 정보를 알려준다.

nrow() 함수는 이 데이터 프레임에 몇개의 행이 있는지 알려준다.

count() 함수는 어떤 열에 있는 고유값의 개수를 알려준다. 이런 식으로 쓰면 된다.

df %>% count(column_name)

파이프 연산자 : %>%

pipe 연산자 %>%함수 여러개를 한 줄로 묶어주는 기능을 한다. 이걸 사용하면 코드의 가독성이 높아진다.

예를 들어 head(df)로 하던 걸 그냥 df를 미리 선언한 후, head()함수를 연달아 호출하면 된다. 이렇게.

df %>% head()

그리고 이 오른쪽에 이어서 %>%를 쓰고 다른 함수를 적용할 수도 있다.

참고로 이 파이프 연산자는 base R에서 기본적으로 제공하는 기능은 아니고 magrittr 패키지에서 제공되는 거다. 그러나 굳이 magrittr를 불러올 필요는 없다. dplyr와 같은 패키지를 불러오면 %> %는 자동으로 따라오기 때문에.


열 선택하기, 제거하기 : select()

select() 함수로 특정 열을 선택할 수 있다.

df %>% select(column1, column2)

열 이름 앞에 – 기호를 넣어주면 데이터 프레임에서 그 열만 빼고 돌려준다.

df %>% select(-column3, -column4)

행 필터링하기 : filter()

dplyr 패키지의 filter() 함수를 사용하면 특정 조건을 만족하는 행을 필터링할 수 있다.

이름이 Lee인 행만 가져오기

df %>% filter(name == 'Lee')

이름은 Lee AND(,) 나이는 25 이상인 행만 가져오기

df %>% filter(name == 'Lee', age >= 25)

이름이 Lee OR(|) 키가 160 이상인 행만 가져오기

df %>% filter(name == 'Lee' | height >= 160)

이름이 Kim이 아닌 NOT(!) 행만 가져오기 (이 조건을 만족하는 행만 제거하기)

df %>% filter(!(name == ‘Kim’))
df %>% filter(name != ‘Kim’))

행 정렬하기 : arrange()

dplyr패키지의 arrange() 함수를 사용하면 특정 조건을 기준으로 행을 정렬할 수 있다.

이름 열을 기준으로 오름차순 정렬하기

df %>% arrange(name)

오름차순이 기본값이다. 내림차순 정렬하려면 arrange() 함수 안에 desc()를 써줘야 한다.

df %>% arrange(desc(name))

arrange() 함수 안에 열을 여러개 넣어주는 것도 가능하다.

df %>% arrange(column1, column2)

column1을 기준으로 오름차순으로 정렬 후, 그 안에서 column2를 기준으로 오름차순 정렬하는 거다. column1을 기준으로 정렬하되, 값이 같을 경우 column2를 기준으로 정렬한다.

만약 두 번째 열은 내림차순으로 하고 싶다면 이런 방식으로 써주는 것도 가능하다.

df %>% arrange(column1, desc(column2))

열 추가하기 : mutate()

데이터프레임에 열을 추가하려면 mutate() 함수를 활용해서, 괄호 안에 열 이름과 그 값을 정의하는 식 형태로 써주면 된다. 당연히 기존 열을 기준으로 계산하는 것도 가능하다.

mutate()는 기존 데이터프레임에서 새로운 열이 추가된 데이터 프레임을 돌려주는 방식으로 작동한다. 기존 데이터프레임을 업데이트 한다는 뜻이다.

예를 들어 기존에 있던 열 price에 0.01을 곱한 값을 가지는 tax라는 새로운 열을 생성한다고 하면 이렇게.

df %>% mutate(tax = price * 0.01)

여러 열을 동시에 생성하는 것도 가능하다.

df %>% mutate(tax = price * 0.01, profit = price - cost, in_stock = TRUE)

새로 추가한 열만 가져오기 : transmute()

mutate() 함수는 기존 데이터프레임에 새로 추가한 열을 포함해서 돌려준다면, transmute()기존 데이터프레임을 보존하지 않고 새로 추가한 열만 돌려준다.

사용법은 mutate()와 동일하다.

예를 들어 기존 데이터프레임에 있던 price, cost 열을 활용해서 tax, profit를 계산하고 그것만 남기려면.

df %>% transmute(tax = price * 0.075, profit = price - cost)

열 이름 수정하기 : rename()

기존에 있던 열 이름을 새로운 이름으로 바꿔주는 건 dplyr 패키지의 rename() 함수를 활용한다.

df %>% rename(new_name1 = old_name1,  new_name2 = old_name2)

base R의 names()colnames() 함수를 사용하면 열 이름을 확인할 수 있다. 괄호 안에 데이터프레임을 인수로 넣어주면 된다.

names(df)
colnames(df)

일단 데이터프레임 조작 방법은 여기까지.

R이 확실히 파이썬보다는 쉬운 것 같다.

아직까지는?

추천 글

댓글 남기기