데이터 가공


특정 조건 데이터 추출

> library("dplyr")
> exam = read.csv("csv_exam.csv")
> exam %>% filter(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

dplyr를 사용하기 위해 library 함수를 이용해 준비합니다. 그 후 csv_exam.csv 파일을 읽어오고 exam %>% filter(class == 1)을 작성합니다.

여기서 %>%는 dplyr에서 함수를 나열할 때 사용합니다. filter안에 있는 값을 해당 조건에 맞는 결과만을 출력해 줍니다.

> exam %>% filter(class == 1) %>% filter(math > 50)
  id class math english science
1  2     1   60      97      60

위 코드는 class가 1이면서 math의 값이 50이상인 항목을 출력하는 코드입니다. 여기서 %>%를 이용하여 함수를 나열하여 사용하는 것을 볼 수 있습니다.

기타 다른 언어와는 조금다른 or, and는 “”, “&”로 사용합니다. 다른 언어에서는 bit 연산자로 이용되지만 R에서는 논리 연산자로 이용됩니다.

이번에는 class가 1, 3, 5 인 경우를 출력해 보겠습니다. 간단하게는 class == 1 & class == 2 & class == 3 으로 사용할 수 있지만 아래 코드 처름 %in%을 이용할 수 있습니다.

> exam %>% filter(class %in% c(1, 3, 5))
   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
5   9     3   20      98      15
6  10     3   50      98      45
7  11     3   65      65      65
8  12     3   45      85      32
9  17     5   65      68      98
10 18     5   80      78      90
11 19     5   89      68      87
12 20     5   78      83      58

이번에는 math의 값만 가져오도록 해보겠습니다.

> exam %>% select(math)
   math
1    50
2    60
3    45
4    30
5    25
6    50
7    80
8    90
9    20
10   50
11   65
12   45
13   46
14   48
15   75
16   58
17   65
18   80
19   89
20   78

위 코드 처럼 특정 속성만 가져올 경우에는 select()함수를 사용하면 됩니다. 또한 여러 개 속성을 가져오는 경우에는 select(속성1, 속성2, ...)과 같이 사용하면 됩니다.

추가적으로 특정 속성만을 제외하고자 하는 경우에는 select(-속성) 으로 속성 앞에 -를 넣어주면 됩니다.

오름차순, 내림차순 정렬

오름차순과 내림차순으로 정렬을 하고자 하는경우에는 arrange() 함수를 사용하면 됩니다. 기본적으로 오름차순으로 정렬됩니다.

> 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
7  14     4   48      87      12
8   1     1   50      98      50
9   6     2   50      89      98
10 10     3   50      98      45
11 16     4   58      98      65
12  2     1   60      97      60
13 11     3   65      65      65
14 17     5   65      68      98
15 15     4   75      56      78
16 20     5   78      83      58
17  7     2   80      90      45
18 18     5   80      78      90
19 19     5   89      68      87
20  8     2   90      78      25
> exam %>% arrange(desc(math))
   id class math english science
1   8     2   90      78      25
2  19     5   89      68      87
3   7     2   80      90      45
4  18     5   80      78      90
5  20     5   78      83      58
6  15     4   75      56      78
7  11     3   65      65      65
8  17     5   65      68      98
9   2     1   60      97      60
10 16     4   58      98      65
11  1     1   50      98      50
12  6     2   50      89      98
13 10     3   50      98      45
14 14     4   48      87      12
15 13     4   46      98      65
16  3     1   45      86      78
17 12     3   45      85      32
18  4     1   30      98      58
19  5     2   25      80      65
20  9     3   20      98      15

내림차순으로 정렬하고자 하는 경우에는 arrange(desc(math))와 같이 desc()를 넣어주어야 합니다.

추가변수 생성하기

기존에 추가변수를 생성하기 위해서 데이터프레임$속성명 = 값의 형식을 사용했습니다.

이번에는 mutate()를 이용하여 기존 데이터에 추가 변수를 넣어 주도록 하겠습니다.

> exam %>%
+     mutate(total = math + english + science, mean = (math + english + science) / 3)
   id class math english science total     mean
1   1     1   50      98      50   198 66.00000
2   2     1   60      97      60   217 72.33333
3   3     1   45      86      78   209 69.66667
4   4     1   30      98      58   186 62.00000
5   5     2   25      80      65   170 56.66667
6   6     2   50      89      98   237 79.00000
7   7     2   80      90      45   215 71.66667
8   8     2   90      78      25   193 64.33333
9   9     3   20      98      15   133 44.33333
10 10     3   50      98      45   193 64.33333
11 11     3   65      65      65   195 65.00000
12 12     3   45      85      32   162 54.00000
13 13     4   46      98      65   209 69.66667
14 14     4   48      87      12   147 49.00000
15 15     4   75      56      78   209 69.66667
16 16     4   58      98      65   221 73.66667
17 17     5   65      68      98   231 77.00000
18 18     5   80      78      90   248 82.66667
19 19     5   89      68      87   244 81.33333
20 20     5   78      83      58   219 73.00000

mutate() 함수에 추가할 속성 = 값 형식으로 넣어주면 해당 속성에 값이 저장되게 됩니다. 마찬가지로 속성 = ifelse(조건, 참결과, 거짓결과) 를 이용하여 사용할 수 있습니다.

그룹핑

csv_exam.csv는 각 반별 수학, 과학, 영어의 점수가 저장되어 있습니다. 여기서 각 반의 수학 평균 점수를 나타내고자 하는 경우 먼저, 각 반 별로 그룹화 되어야 하며 해당 그룹의 수학점수를 합산하여 평균을 내어야 합니다.

> exam %>% group_by(class) %>% summarise(mean_math = mean(math))
# A tibble: 5 x 2
  class mean_math
  <int>     <dbl>
1     1      46.2
2     2      61.2
3     3      45  
4     4      56.8
5     5      78 

그룹핑을 위해서는 group_by(속성명)을 이용하여 해당 그룹끼리 묶일 수 있으며 summarise()는 그룹에서의 결과를 나타내어 줍니다. 마찬가지로 summarise()에 여러개의 속성을 넣어 출력할 수 있습ㄴ디ㅏ.

데이터 합치기

idmidterm
180
270
360
idfinal
190
280
370

위 두개의 데이터가 존재하는 경우 아래와 같이 가로로 합치는 방법을 알아보겠습니다.

idmidtermfinal
18090
27080
36070
> midterm = data.frame(id = c(1, 2, 3), midterm = c(80, 70, 60))
> final = data.frame(id = c(1, 2, 3), final = c(90, 80, 70))
> midterm
  id midterm
1  1      80
2  2      70
3  3      60
> final
  id final
1  1    90
2  2    80
3  3    70

먼저 위 코드 처럼 midterm과 final 데이터를 준비합니다.

두 데이터 프레임을 결합하기 위해서는 left_join(), right_join()을 이용합니다.

> total = left_join(midterm, final, by = "id")
> total
  id midterm final
1  1      80    90
2  2      70    80
3  3      60    70
> total2 = right_join(midterm, final, by = "id")
> total2
  id midterm final
1  1      80    90
2  2      70    80
3  3      60    70

여기서 각 join에 by를 이용하여 어떤 속성을 기준으로 합쳐질 것인지 정해주어야 하며 ""로 감싸야 합니다.

이번에는 아래 데이터가 존재하는 경우 세로로 합치는 방법에 대해 알아보겠습니다.

idmidterm
180
270
360
idmidterm
450
540
630
> a = data.frame(id = c(1,2,3), score = c(80, 70, 60))
> b = data.frame(id = c(4,5,6), score = c(50, 40, 30))
> a
  id score
1  1    80
2  2    70
3  3    60
> b
  id score
1  4    50
2  5    40
3  6    30
> all = bind_rows(a, b)
> all
  id score
1  1    80
2  2    70
3  3    60
4  4    50
5  5    40
6  6    30

a와 b에 대한 데이터 프레임을 생성하고 bind_row를 이용하여 결합할 데이터 프레임을 넣어주면 두 데이터 프레임이 하나의 데이터 프레임으로 합쳐지게 됩니다.




© 2017. by k3y6reak

Powered by k3y6reak