본문 바로가기

데이터/R 프로그래밍

R 프로그래밍 기초 (3)

1. 데이터 전처리 

 

데이터 전처리(Data Preprocessing)

 

- 분석에 적합하게 데이터를 가공하는 작업

- 일부를 추출하거나, 종류별로 나누거나, 여러 데이터를 합치는 등 데이터를 자유롭게 가공할 수 있어야 목적에 맞게 분석 가능

 

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

dplyr 함수 기능
filter() 행 추출
select() 열(변수) 추출
arrange() 정렬
mutate() 변수 추가
summarise() 통계치 산출
group_by() 집단별로 나누기
left_join() 데이터 합치기(열)
bind_rows() 데이터 합치기(행)

 

2. 조건에 맞는 데이터만 추출하기 

 

- dplyr 패키지의 filter()를 이용하면 원하는 데이터를 추출할 수 있음

 

dplyr 패키지를 로드한 후 csv_exam.csv 파일을 데이터 프레임으로 만들고 출력

 

library(dplyr)
exam<-read.csv("csv_exam.csv")
exam

 ##  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   5     2   25      80      65
6   6     2   50      89      98
7   7     2   80      90      45

 

1) dplyr 패키지의 filter()를 이용해 1반 학생들의 데이터만 출력

 

#exam에서 class가 1인 경우만 추출해 출력
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 패키지는 %>% 기호(파이프 연산자)를 이용해 함수들을 나열하는 방식으로 코드를 작성

- 위 코드는 exam을 출력하되, class가 1인 행만 추출하라는 조건이 지정되어 있음

- filter()안의 class==1은 'class 변수의 값이 1인 행'을 의미 

 

2)  변수가 특정값이 '아닌 경우'에 해당하는 데이터만 추출

 

- 등호 앞에 느낌표를 붙여 != 이라고 쓰면 '같지 않다'를 의미하는 기호가 됨

 

# 1반이 아닌 경우 
exam %>% filter(class!=1)


   id class math english science
1   5     2   25      80      65
2   6     2   50      89      98
3   7     2   80      90      45
4   8     2   90      78      25
5   9     3   20      98      15

 

3) 여러 조건을 충족하는 행 추출하기 

 

- '그리고(and)'를 의미하는 기호 &를 사용해 조건을 나열하면 여러 조건을 동시에 충족하는 행을 추출할 수 있음

 # 1반이면서 수학 점수가 50점 이상인 경우 
 exam %>% filter(class == 1 & math >=50)
 
## id class math english science
1  1     1   50      98      50
2  2     1   60      97      60

 

 

4) 여러 조건 중 하나 이상 충족하는 행 추출하기 

 

 - '또는(or)'을 의미하는 | 기호를 이용하면 여러 조건 중 하나라도 충족하는 데이터를 추출할 수 있음

 # 영어 점수가 90점 미만이거나 과학 점수가 50점 미만인 경우 
 exam %>% filter(english<90 | science<50)
 
 ## id class math english science
1   3     1   45      86      78
2   5     2   25      80      65
3   6     2   50      89      98
4   7     2   80      90      45
5   8     2   90      78      25
6   9     3   20      98      15

 

5) 추출한 행으로 데이터 만들기 

 

- 새 변수를 만들 때 처럼 <- 기호를 이용하면 추출한 행으로 새로운 데이터를 만들 수 있음

- 데이터를 조건별로 나눠 활용하고자 할 때 이런 형태로 코드 작성

 

 class1 <-exam %>% filter(class==1) # class가 1인 행 추출, class1에 할당
 class2<-exam %>% filter(class==2)  # class가 2인 행 추출, class2에 할당
 
mean(class1$math) # 1반 수학 점수 평균 구하기 

##[1] 46.25

> mean(class2$math) # 2반 수학 점수 평균 구하기 

##[1] 61.25

 

6) 목록에 해당하는 행 추출하기 

 

- %in% 기호는 변수의 값이 지정한 조건 목록에 해당하는지 확인 

 

exam %>% filter(class %in% c(1,3,5)) # 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

 

 

3. 필요한 변수만 추출하기 

 

1) 변수 추출하기 

 

- exam에서 math 변수만 추출

- 데이터 프레임명을 입력한 후 %>%select()를 연결

- 괄호 안에는 추출한 변수 이름 입력

 

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

##   math
1    50
2    60
3    45
4    30

 

2) 여러 변수 추출하기 

 

- 쉼표를 넣어 변수명을 나열하면 여러 변수를 동시에 추출 가능

 

 exam %>% select(class,math,english) # class, math, english 변수 추출
  
  ##class math english
1      1   50      98
2      1   60      97
3      1   45      86
4      1   30      98

 

3) 변수 제외하기 

 

- 특정 변수만 제외하고 나머지 모든 변수 추출

- 제외할 변수명 앞에 빼기 기호 -를 입력하면 됨 

 

exam %>% select(-math) # math 제외 
   
   ##id class english science
1   1     1      98      50
2   2     1      97      60
3   3     1      86      78
4   4     1      98      58
5   5     2      80      65

 

4) dplyr 함수 조합하기 

 

- dplyr 패키지의 함수들은 %>%를 이용해 조합할 수 있다는 장점이 있음

 

● filter()와 select() 조합

 

- filter()와 select()를 조합해서 1반 학생의 영어 점수 추출

 

# class가 1인 행만 추출한 다음 english 추출
exam %>% filter(class==1) %>% select(english) 
  
  ##english
1      98
2      97
3      86
4      98

 

● 가독성 있게 줄 바꾸기 

 

- %>%로 코드가 연결되는 부분에서 줄을 바꾸면 함수별로 구분되기 때문에 가독성 있는 코드를 만들 수 있음 

- %>% 뒤에서 enter로 줄을 바꾸면 자동으로 일정 간격이 띄어져서 어디까지 dplyr 코드 단락인지 한눈에 파악할 수 있음

 

exam %>%
    filter(class==1) %>%
    select(english)

 

● 일부만 출력하기 

 

- 데이터의 일부를 출력할 때 사용하는 head()dplyr에 조합해 사용할 수 있음

- dplyr 구문의 마지막에 %>%로 연결해 head를 입력하면 됨

 

exam %>% 
+     select(id,math) %>% # id,math 추출
+     head # 앞부분 6행까지 추출

 ## id math
1  1   50
2  2   60
3  3   45
4  4   30
5  5   25
6  6   50

 

 

4. 순서대로 정렬하기 

 

1) 오름차순으로 정렬하기 

 

- arrange()에 math를 입력하면 수학 점수가 낮은 사람에서 높은 사람 순으로 오름차순 정렬해 출력

 

exam %>% arrange(math) # 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

 

2) 내림차순으로 정렬하기 

 

- 내림차순 정렬하려면 기준 변수를 desc()에 적용

- math가 높은사람부터 낮은 사람 순으로 출력

 

exam %>% arrange(desc(math)) # 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

 

- 정렬 기준으로 삼을 변수를 여러 개 지정하려면 쉼표를 이용해 변수명을 나열하면 됨 

- 반을 기준으로 오름차순 정렬한 후 각 반에서 수학 점수를 기준으로 오름차순 정렬해 출력

exam %>% arrange(class,math) # class 및 math 오름차순 정렬
 
 ##id class math english science
1   4     1   30      98      58
2   3     1   45      86      78
3   1     1   50      98      50
4   2     1   60      97      60
5   5     2   25      80      65
6   6     2   50      89      98

 

 

5. 파생변수 추가하기 

 

1) 파생변수 추가하기 

 

- mutate()를 사용하면 기존 데이터에 파생변수를 만들어 추가할 수 있음

- mutate()에 새로 만들 변수명과 변수를 만들 때 사용할 공식을 입력하면 됨

 

- exam에 세 과목의 점수를 모두 합한 총합 변수를 만들어 추가한후 일부만 출력

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

 

2) 여러 파생변수 한 번에 추가하기 

 

- 쉼표를 이용해 새 변수명과 변수를 만드는 공식을 나열하면 됨

 

exam %>% 
+ mutate(total=math+english+science, # 총합 변수 추가
+ mean=(math+english+science)/3) %>%  # 총평균 변수 추가
+ head() # 일부 추출


##  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

 

3) mutate()에 ifelse() 적용하기 

 

- mutate()에 iselse()를 적용하면 조건에 따라 다른 값을 부여한 변수를 추가할 수 있음

 

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

 

4) 추가한 변수를 dplyr 코드에 바로 활용하기 

 

- 변수를 추가하고 나면 이어지는 dplyr 코드에 바로 활용할 수 있음

- mutate()로 추가한 변수를 arrange()에서 기준으로 삼아 정렬해 일부를 출력

 

exam %>% 
+ mutate(total=math+english+science) %>%  #총합 변수 추가
+ arrange(total) %>%  # 총합 변수 기준 정렬
+ head # 일부 정렬


##id class math english science total
1  9     3   20      98      15   133
2 14     4   48      87      12   147
3 12     3   45      85      32   162
4  5     2   25      80      65   170
5  4     1   30      98      58   186
6  8     2   90      78      25   193

 

 

6. 집단별로 요약하기 

 

- 집단별 평균이나 집단별 빈도처럼 각 집단을 요약한 값을 구할 때는 group_by()summarise()를 사용

 

1) summarise() 사용

 

- 수학 점수 평균을 구한 후 mean_math()라는 새로운 변수에 할당해 출력하는 기능

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

 

- summarise()는 전체를 요약한 값을 구하기보다는 group_by()와 조합해 집단별 요약표를 만들 때 사용 

 

2) 집단별로 요약하기 

 

- group_by()에 변수를 지정하면 변수 항목별로 데이터를 분리 

- 여기에 summarise()를 조합하면 집단별 요약 통계량을 산출 

- 반별 수학 점수 평균을 산출

exam %>% 
+ group_by(class) %>% #class별로 분리 
+ summarise(mean_math=mean(math)) #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

 

3) 여러 요약 통계량 한 번에 산출하기 

 

- mutate()로 여러 변수를 동시에 추가했던 것과 마찬가지로 summarise()로도 여러 요약 통계량을 한번에 산출 가능

 

 exam %>% 
+ group_by(class) %>% # class별로 분리 
+ summarise(mean_math=mean(math), #math 평균
sum_math=sum(math), #math 합계
median_math=median(math), #math 중앙값
n=n()) #학생 수 


# A tibble: 5 × 5
  class mean_math sum_math median_math     n
  <int>     <dbl>    <int>       <dbl> <int>
1     1      46.2      185        47.5     4
2     2      61.2      245        65       4
3     3      45        180        47.5     4
4     4      56.8      227        53       4
5     5      78        312        79       4

- n()은 데이터가 몇 행으로 되어 있는지 '빈도'를 구하는 기능 

 

4) 각 집단별로 다시 집단 나누기

 

- group_by()에 여러 변수를 지정하면 집단을 나눈 후 다시 하위 집단으로 나눌 수 있다

 

ex) mpg 데이터를 이용해 하위 집단별 평균 구하기 

 회사별로 집단을 나눈 후 다시 구동 방식별로 나눠 도시 연비 평균 구하기 

mpg %>% 
+ group_by(manufacturer,drv) %>%  #회사별, 구동 방식별
+ summarise(mean_cty=mean(cty)) %>%  #cty 평균 산출
+ head(10) # 일부 출력

#  A tibble: 10 × 3
# Groups:   manufacturer [5]
   manufacturer drv   mean_cty
   <chr>        <chr>    <dbl>
 1 audi         4         16.8
 2 audi         f         18.9
 3 chevrolet    4         12.5
 4 chevrolet    f         18.8
 5 chevrolet    r         14.1
 6 dodge        4         12  
 7 dodge        f         15.8
 8 ford         4         13.3
 9 ford         r         14.8
10 honda        f         24.4

 

 

5) dplyr 조합하기 

 

- 회사별로 "suv" 자동차의 도시 및 고속도로 통합 연비 평균을 구해 내림차순으로 정렬하고, 1~5위 까지 출력

 

 mpg %>% 
+ group_by(manufacturer) %>%  # 회사별로 분리
+ filter(class=="suv") %>%  # suv 추출
+ mutate(tot=(cty+hwy)/2) %>%  # 통합 연비 변수 생성
+ summarise(mean_tot=mean(tot)) %>%  # 통합 연비 평균 산출
+ arrange(desc(mean_tot)) %>%   # 내림차순 출력
+ head(5)  #1~5위까지 출력


# A tibble: 5 × 2
  manufacturer mean_tot
  <chr>           <dbl>
1 subaru           21.9
2 toyota           16.3
3 nissan           15.9
4 mercury          15.6
5 jeep             15.6

 

 

7. 데이터 합치기 

 

1) 가로로 합치기 

 

- 다섯명이 중간고사와 기말고사를 봤다고 가정하고, 2개의 데이터 프레임 만들기 

 

# 중간고사 데이터 생성
test1 <-data.frame(id=c(1,2,3,4,5), midter=c(60,80,70,90,85)) 

# 기말고사 데이터 생성
 test2<-data.frame(id=c(1,2,3,4,5), final=c(80,83,65,95,80))
 
test1 #test1 출력
  id midter
1  1     60
2  2     80
3  3     70
4  4     90
5  5     85


test2 # test2 출력
  id final
1  1    80
2  2    83
3  3    65
4  4    95
5  5    80

 

- dplyr 패키지 left_join()을 이용하면 가로로 합칠 수 있음

- 괄호 안에 합칠 데이터 프레임명을 나열하고, 기준으로 삼을 변수명을 by에 지정 

 

total<-left_join(test1,test2,by="id") #id를 기준으로 합쳐 total에 할당
total  #total출력 
 

##  id midter final
1  1     60    80
2  2     80    83
3  3     70    65
4  4     90    95
5  5     85    80

 

2) 다른 데이터를 활용해 변수 추가하기 

 

- left_join()을 응용하면 특정 변수의 값을 기준으로 다른 데이터의 값을 추가할 수 있음

 

ex)

● 각 반 학생들의 시험 점수를 담은 exam 데이터를 분석하고 있는데, 추가로 반별 담임교사 명단을 얻었다고 가정

 

- 담임교사 명단 데이터 

name<-data.frame(class=c(1,2,3,4,5), teacher=c("Kim","lee","park","choi","jung"))
name


  class teacher
1     1     Kim
2     2     lee
3     3    park
4     4    choi
5     5    jung

 

● name은 class와 teacher 두 변수로 구성

class 변수를 기준으로 삼아 name의 teacher 변수를 name에 추가 

 

exam_new<-left_join(exam,name,by="class")
exam_new


##   id class math english science teacher
1   1     1   50      98      50     Kim
2   2     1   60      97      60     Kim
3   3     1   45      86      78     Kim
4   4     1   30      98      58     Kim
5   5     2   25      80      65     lee
6   6     2   50      89      98     lee
7   7     2   80      90      45     lee
8   8     2   90      78      25     lee
9   9     3   20      98      15    park
10 10     3   50      98      45    park

 

 

3) 세로로 합치기 

 

- 학생 다섯 명이 먼저 시험을 보고, 나중에 다섯 명이 따로 시험을 봤다고 가정하고 2개의 데이터 프레임 만들기 

 

#학생 1~5번 시험 데이터 생성
group_a<-data.frame(id=c(1,2,3,4,5),test=c(60,80,70,90,85))

#학생 6~10번 시험 데이터 생성
group_b<-data.frame(id=c(6,7,8,9,10), test=c(70,83,65,95,80))


group_a #group_a 출력

  id test
1  1   60
2  2   80
3  3   70
4  4   90
5  5   85

group_b #group_b 출력

  id test
1  6   70
2  7   83
3  8   65
4  9   95
5 10   80

 

- bind_rows()를 이용하면 데이터를 세로로 합칠 수 있음

- 괄호 안에 합칠 데이터 프레임을 나열하면 됨 

 

group_all <-bind_rows(group_a,group_b) # 데이터 합쳐서 group_all에 할당
group_all  #group_all 출력


##   id test
1   1   60
2   2   80
3   3   70
4   4   90
5   5   85
6   6   70
7   7   83
8   8   65
9   9   95
10 10   80

- 데이터를 세로로 합칠 때는 두 데이터의 변수명이 같아야 함

- 만약 변수명이 다르면 rename()을 이용해 동일하게 맞춘 후에 합치면 됨 

 

'데이터 > R 프로그래밍' 카테고리의 다른 글

R 프로그래밍 기초 (4)  (0) 2023.10.16
R 프로그래밍 기초(2)  (0) 2023.10.13
R 프로그래밍 기초 (1)  (0) 2023.10.12