준비
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이 확실히 파이썬보다는 쉬운 것 같다.
아직까지는?