본문 바로가기

My Work/Data Literacy

R 공부 (3편) - 쉽게 배우는 R 데이터 분석

데이터 전처리

dyplr은 데이터 전처리 작업에 가장 많이 사용되는 패키지이다. 

exam %>% filter(class == 1)  # class가 1인 경우만 출력

# 출력값
  id class math english science
1  1     1   50      98      50
2  2     1   60      97      60
3  3     1   45      86      78
4  4     1   30      98      58

 

여기서 %>%는 파이프 연산자로 왼쪽의 결과를 오른쪽 함수로 전달하라는 뜻을 가지고 있다. filter()에 조건은 '같다'라는 의미를 가지는 '=='도 가능하지만 '같지 않다'라는 '!='도 가능하며 부등호도 쓸 수 있다. 

 

AND, OR 같은 조건도 filter() 안에서 사용할 수 있다. 

class == 1 & math >= 50 : 1반이면서, 수학 점수가 50점 이상인 경우

math >= 90 | english >= 90 :  수학 점수가 90점 이상이거나 영어 점수가 90점 이상인 경우

 

추가로, class == 1 | class == 2 | class == 3과 같이 코드가 길어질 때느 &in&를 활용하여 코드를 간편하게 작성할 수 있다. 

exam %>% filter(class %in% c(1, 3, 5))  # 1, 3, 5반에 해당하면 추출

 

 

다음은 select()이다. 데이터에 들어 있는 변수 중에 일부 변수만 추출해서 활용할 때 사용한다. 

exam %>% select(math)  # math만 추출


# 출력값
> exam %>% select(math)
   math
1    50
2    60
3    45
4    30
5    25
6    50
7    80
8    90
...


exam %>% select(math, english)  # 여러 변수 추출 


exam %>% select(-math)  # math를 제외하고 추출


exam %>% filter(class == 1) %>% select(math)  # class가 1인 행만 추출한 다음 english 추출

 

그 외에도 여러 변수를 추출하거나 특정 변수를 제외하는 등 다양하게 응용이 가능하다. 

 

 

arrange() 같은 경우는 데이터를 정렬하기 위해서 쓰인다. desc를 활용하면 내림차순 정렬이 가능하다. 

exam %>% arrange(math)  # math 오름차순 정렬


# 출력값
> exam %>% arrange(math)
   id class math english science
1   9     3   20      98      15
2   5     2   25      80      65
3   4     1   30      98      58
4   3     1   45      86      78
5  12     3   45      85      32
6  13     4   46      98      65
...


exam %>% arrange(desc(math))  # math 내림차순 정렬


exam %>% arrange(math, class)  # class 및 math 오름차순 정렬

 

 

mutate() 같은 경우는 파생 변수를 만들어 추가할 때 사용한다. 마찬가지로 () 안에 쉼표(,)로 변수를 구분하면 여러 파생변수를 한 번에 추가할 수 있고 ifelse()를 활용하면 조건에 따른 다른 값을 부여할 수 있다. 

exam %>% mutate(total = math + english + science) %>%  # 총합 변수 추가
head  # 일부 추출


# 출력값
  id class math english science total
1  1     1   50      98      50   198
2  2     1   60      97      60   217
3  3     1   45      86      78   209
4  4     1   30      98      58   186
5  5     2   25      80      65   170
6  6     2   50      89      98   237


exam %>% mutate(test = ifelse(science >= 60, "pass", "fail")) %>%  # 조건에 따른 변수 추가 부여
head  # 일부 추출


# 출력값
> exam %>% mutate(test = ifelse(science >= 60, "pass", "fail")) %>% 
+ head  
  id class math english science test
1  1     1   50      98      50 fail
2  2     1   60      97      60 pass
3  3     1   45      86      78 pass
4  4     1   30      98      58 fail
5  5     2   25      80      65 pass
6  6     2   50      89      98 pass

 

 

요약을 할 때는 group_by()나 summarise()을 사용한다. 

exam %>% summarise(mean_math = mean(math))  # 수학 평균 산출


# 출력값
  mean_math
1     57.45


exam %>% group_by(class) %>% summarise(mean_math = mean(math))  # class별 math 평균


#출력값
# A tibble: 5 × 2
  class mean_math
  <int>     <dbl>
1     1      46.2
2     2      61.2
3     3      45  
4     4      56.8
5     5      78

 

 

그 외에도 Dataframe을 합치는 함수도 있다. 기존의 데이터에 열을 추가할 때는 left_join을 사용하고 행을 추가할 때는 bind_row()을 사용한다. 

# 중간고사 데이터 생성
test1 <- data.frame(id = c(1, 2, 3, 4, 5), mid = c(1, 2, 3, 4, 8))
test2 <- data.frame(id = c(1, 2, 3, 4, 5), fin = c(1, 2, 3, 4, 8))


# id를 기준으로 합치기
total <- left_join(test1, test2, by = "id")
total


# 출력값
  id mid fin
1  1   1   1
2  2   2   2
3  3   3   3
4  4   4   4
5  5   8   8


# group1, 2 변수 생성
group1 <- data.frame(id = c(1, 2, 3, 4, 5), mid = c(1, 2, 3, 4, 8))
group2 <- data.frame(id = c(6, 7, 8, 9, 10), mid = c(1, 2, 3, 4, 8))


# group_all로 합치기
group_all <- bind_rows(group1, group2)
group_all


# 출력값
   id mid
1   1   1
2   2   2
3   3   3
4   4   4
5   5   8
6   6   1
7   7   2
8   8   3
9   9   4
10 10   8