R/강의복습

[22.08.11] 4일차 강의(arrange / filter / select / mutate / summarize / group_by / join / is.na / na.rm)

peach_h 2022. 8. 14. 23:06
☆ 강의 내용 요약 ☆

arrange : 데이터 정렬 함수
filter : 한 열에서, 지정한 데이터만 추출하는 함수
select : 지정한 컬럼 데이터 추출 함수
mutate : 새로운 데이터 추가 함수
summarize : 전체 데이터에서 연산한 값을 새로운 열로 추가해줌
  mutate = 어떤 연산에 대한 학생들의 전체 데이터 값을 보여줌. ( ex) 학생 각각의 총 점수의 합 )
  summarize = 전체 데이터에서 어떤 연산의 값을 보여줌. ( ex) 반 별로 총점의 평균 )
group_by : ~별로 분리. 행에 추가됨 (summarize랑 세트)
_join : 데이터 합성 함수
is.na : 결측치(NA)가 있는지 검사하는 함수
na.rm : 결측치를 제거하는 함수
na.omit : 결측치를 한번에 제거

 

 

 

# exam 자료 활용하기
library(dplyr)
library(ggplot2)

getwd()
setwd("f:\\r_workspace\\Data")

exam = read.csv("csv_exam.csv")​

arrange 활용해서 데이터 정렬하기

 

반별로 정렬 후 수학 성적순 정렬 / 총점 구하고 반별 등수세우기

두가지를 한번에 정렬하기도 가능 !

# mpg 자료 활용하기
audi 차종 hwy순으로 정렬하기
mpg %>% filter(manufacturer=='audi') %>% 
  arrange(desc(hwy)) %>% 
  select(manufacturer,hwy) %>% 
  head(6)

* select로 원하는 열만 골라서 추출하기 가능

 

# mutate 활용하기

* mutate : 새로운 변수를 추가하는 함수

exam %>% 
  mutate(total = math + english + science) %>% 
  head(3)

한번에 total 칼럼을 추가할 수 있다 !

반 별로, 총점 높은 순으로 정렬하기
exam %>% 
  mutate(total = math + english + science) %>% 
  arrange(class, desc(total)) %>% 
  head(6)

hwy와 cty의 평균을 구하고 30이상 A, 20이상 B, 나머지 C
mpg %>% mutate(avg = (hwy+cty)/2,
        grade = ifelse(avg>=30,"A",ifelse(avg>=20,"B","C"))) %>%
        select(hwy,cty,avg,grade) %>% 
        head(6)

과목별 평균 구하기
exam %>% summarize( mean_math = mean(math), 
                    mean_science = mean(science),
                    mean_eng= mean(english))

* summarize( ) : 열 기준 통계 구하기

 

 

반 별로 과목별 평균, 학생 수 구하기
exam %>%  group_by(class) %>% 
            summarize( mean_math = mean(math), 
             mean_science = mean(science),
             mean_eng= mean(english),
             studentcnt = n())

* group_by로 추가된 필드가 행, summarize로 추가된 필드가 열이 된다 ! (둘이세트임)

 

 

반 별로 수학 평균, 분산, 표준 편차 구하기
exam %>% group_by(class) %>% 
   summarize(mean_math=mean(math), var_m=var(math), sd_m=sd(math))

회사별, 구동방식별로 cty 평균 구하기
mpg %>%
  group_by(manufacturer, drv) %>% # 회사별, 구동방식별 분리
  summarise(mean_cty = mean(cty)) %>% # cty 평균 산출
  head(10)

 

 

class가 suv인 차들의 manufacturer별로 cty와 hwy 평균의 평균 값 구하기
mpg %>% filter(class=="suv") %>%  # 차종 suv 분류
       mutate(tot = (cty+hwy)/2) %>%  # cty와 hwy 평균 구하기
       group_by(manufacturer)  %>%  # manufacturer 별로 분류
       summarize( mean_tot = mean(tot)) %>% # manufacturer 별로 tot 평균 구함
       arrange( desc(mean_tot)) %>% # 정렬
       head(5)

class별 cty 평균 구해서 줄세우기
mpg %>% group_by(class) %>% # class 별로 분류
  summarize(m=mean(cty)) %>%  # cty 평균 구하기
  arrange(desc(m)) # 줄세우기

 

iris의 각 종류별 암술높이길이 수술높이길이 평균구하기
iris %>% group_by(Species) %>%
    summarize(sl=mean(Sepal.Length), sw=mean(Sepal.Width), 
              pl=mean(Petal.Length), p2=mean(Petal.Width))

class가 compact인 manufacturer이 몇개인가
mpg %>% filter(class=="compact") %>%
        group_by(manufacturer) %>%
        summarize( count = n() ) %>%
        arrange(desc(count))

 

# Left_join 활용하기 / 행 합성하기
* left_join(a, b) : 데이터를 추가하는 함수 => a의 데이터 수 만큼만 b 값을 보여줌.
* right_join(a, b) : b의 데이터수에 맞춰서 a 값이 나옴. 

 

Q) a랑 b의 수가 맞지 않는다면?

left_join : b가 NULL 

right_join : a가 NULL

-> 초과되는 값은 그냥 버려진다

중간고사와 기말고사 데이터 합치기
#중간고사 데이터 생성
test1 <- data.frame(id=1:5, midterm=c(60, 80, 70, 90, 85))
#기말고사 데이터 생성
test2 <- data.frame(id=1:7, final=c(70,83,65,95, 80, 90, 100))

test3 <- left_join(test1, test2, by="id")
test3

test4 <- right_join(test1, test2, by="id")
test4

inner_join(a, b) : 둘중하나라도 일치되지 않는 값은 삭제됨

full_join(a, b) : 매칭 여부 상관없이 합쳐짐

반 별로 선생님 추가하기
teacher <- data.frame(class=1:5,  teacher=c("홍길동", "임꺽정", "장길산", "홍경래", "강감찬"))
exam2 <- left_join(exam, teacher, by="class") # class 별로 exam에 teacher 붙이기

 

# bind_rows( ) : 열을 합성하는 함수 / 열 합성하기
# 데이터 생성
group_a <- data.frame(id=1:5,  test=c(60,80,70,90,85))
group_b <- data.frame(id=6:10, test=c(70,70,70,90,85))
group_c <- data.frame(id=11:20, test=c(70,70,70,90,85,60,60,60,60,50),
                      test2=sample(40:100, replace=T, 10))
# 행 합성
group_all <- bind_rows(group_a, group_b, group_c)

 

# stringsAsFactors => 들어오는 데이터를 factor타입으로
fuel <- data.frame(fl = c("c", "d", "e", "p", "r"), # 이름
                   price_fl = c(2.35, 2.38, 2.11, 2.76, 2.22), # 가격
                   stringsAsFactors = F) # factor로 가져오기

mpg2 = left_join( mpg, fuel, by="fl") # mpg값에 f1별로 fuel합성하기
mpg2[1:20,] # 20개만 나오게

 

select로 원하는 컬럼 내용 추출
mpg2 %>% select(model, fl, price_fl ) %>% head(5)

midwest 자료 활용하기
미성년 백분율 높은 순위 5개
midwest %>% mutate( popchild = (poptotal-popadults)/poptotal*100,
                    popadultsper=(popadults)/poptotal*100)  %>%
                    # 미성년 비율 구하기
            select( popadults, poptotal, popchild, popadultsper) %>%
            # 나타나게할 컬럼 선택
  			arrange(desc(popchild)) %>% # 정렬
            head(5) # 5개만

 

미성년 비율 등급 변수 추가 / 각 등급에 몇개지역이 있는지
mid <- midwest %>% mutate( popchild = (poptotal-popadults)/poptotal*100,
                     popadultsper=(popadults)/poptotal*100) # 미성년 비율 변수 추가
# 미성년 비율에 따른 등급 추가
mid<- mid %>% mutate(grade= ifelse(popchild>=40, "large", 
					ifelse(popchild>=30, 'middle', 'small')))
# 빈도수 확인 
table(mid$grade)

 

전체 인구 대비 아시아인 백분율 변수 추가 / 하위 10개 지역의 state, country, 아시아인 백분율
midwest %>%  mutate(asian_per=popasian/poptotal*100) %>% # 아시아인 비율 변수 추가
            arrange(asian_per) %>%  # 아시아인 비율 역순으로 정렬
            head(10) %>% # 10개 고르기
            select(state, county, asian_per) # 컬럼 선택

 

# diamonds 자료 활용하기
cut, clarity 별로 가격 평균 요약하기
dia %>% group_by(cut,clarity) %>% 
  summarize(mean_p=mean(price)) # mean_p 컬럼 추가

 

데이터 정제 ( 결측치 제거하기 )
#결측치가 들어간 데이터를 강제로 만들어보자 
df <- data.frame( gender=c("M", "F", NA, "M", "F"), 
                  score = c(5,4,3,4,NA))

# is.na = 각 필드별로 데이터마다 NA면 T, 아니면 F를 데이터 프레임으로 보여줌
# na.rm = NA를제거

 - 연산 실행 전에 항상 결측치가 있는지 확인해볼것!

is.na( df ) # NA 찾기
table( is.na( df ) )  # NA 빈도수 찾기

table( is.na( df$gender ) ) 
table( is.na( df$score ) )

 

score 평균 구하기
df_nomiss <- df %>% filter ( is.na(score) ==F & is.na(gender)==F) # 결측지 제거
mean(df_nomiss$score) # 평균 구하기

 

 na.omit( ) = 결측치를 한번에 제거
exam3 <- na.omit(exam2)
table( is.na(exam3) )

값 대체하기
m1 <- mean(exam2$math, na.rm=T) # 평균값 구하기
exam2$math <- ifelse( is.na(exam2$math), m1, exam$math ) 
# 만약 math 값이 NA면, math의 평균 값으로 데이터를 대체한다

 

결측치 제외하고, drv의 hwy 평균 구하기
mpg %>%
  filter(!is.na(hwy) & !is.na(drv)) %>%  # 결측치 제외
  group_by(drv) %>%  # drv 분리
  summarize(h_avg=mean(hwy)) # hwy 평균구하기

 

~ 후기 ~
[ filter - select ]  [ mutate - summarize ]
얘네가 서로 무슨 차이인지 수업을 들으면서 너무 헷갈렸다..
이번에 복습하면서 확실히 그 차이를 이해했다!

※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우