220824 Day2

유예지·2022년 8월 24일

excel 읽기

install.packages("readxl")   #'readxl' 설치

library(readxl)   #'readxl' 실행

getwd()  #현재 워킹디렉토리 확인
setwd("c:/R/")   #워킹디렉토리를 'R'폴더로 변경

read_excel("excel_exam.xlsx")   #excel 파일 읽기
read.csv("csv_exam.csv")   #csv 파일 읽기

-excel보다 csv가 읽기 더 쉽다 -> csv는 R studio에 원래 설치되어있지만, excel은 설치를 해야하므로
-excel과 csv는 같은 양의 데이터를 저장하고 있어도 excel에는 부가적인 데이터까지 포함하고 있어서 csv보다 파일의 용량이 더 크다
-csv는 부가적인 데이터 없이 깔끔하게 저장이 되므로 excel보다는 csv를 선호

csv 읽기

#특정 부분만 보고 싶은 경우
df <- read.csv("csv_exam.csv")
df

df[1:5,3:5]
df[1:5,-c(1,2)]
df <- df[1:5,-c(1,2)]
df

#csv로 저장(저장함수)
write.csv(df,"csv_test.csv") #무엇을, "파일명(확장자 꼭 포함)"

#한글명으로 된 csv 파일도 읽을 수 있다
read.csv("apt_real_price.csv")
read.csv("apt.csv")
read.csv("아파트(매매)__실거래가_20180513144733.csv", fileEncoding = 'cp949')
read.csv("역별_주소_및_전화번호.csv", fileEncoding = 'cp949')

-fileEncoding = 'cp949' 사용 이유 : 한글명으로 된 파일을 읽기 위해(?)
-cp949 : 코드페이지 949; 더 많은 한글 테이블을 제공한다
-csv는 콤마(,)를 기준으로 데이터 값을 분리하고,
-txt는 tab을 기준으로 데이터 값을 분리한다

데이터를 파악할 때 사용하는 함수

#데이터 살펴보기
library(readxl)
df <- read_excel("excel_exam.xlsx")
df 

head(df)  #데이터 앞부분 출력(앞에서 6줄까지 출력)
head(df, 10)  #앞에서 10줄 출력
head(df, 2)   #앞에서 2줄 출력

tail(df)  #데이터 뒷부분 출력(뒤에서 6줄까지 출력)

View(df)  #뷰어 창에서 데이터 확인(잘 사용하지 않음)

dim(df)   #dimention; 행의 개수, 열의 개수 출력
dim(df)[1]  #행의 개수 출력
dim(df)[2]  #열의 개수 출력

nrow(df)   #row의 개수
ncol(df)   #col의 개수

#많이 사용
str(df)   #데이터 속성 확인; structor; tibble = data frame 보다 더 우월한 데이터 값
summary(df)   #데이터 요약 통계량 출력(최소값, 최대값 등을  알 수 있음)

dplyr(디플라이어) 함수로 가공하기

1. filter : 행 추출

install.packages("dplyr")   #dplyr 함수 먼저 설치
library(dplyr)   #실행

library(readxl)
df <- read_excel("excel_exam.xlsx")

filter(df, class == 1)   #df에서 class가 1인 경우만 추출해 출력

#pipe 연산자("%>%"; 데이터 전달)
#df 전체가 pipe 연산자를 거처나오면 결과물은 작게 나온다
df %>% filter(class == 1)  #df에서 class가 1인 경우만 출력
df %>% filter(class != 1)  #df에서 class가 1이 아닌 경우만 출력

df %>% filter(class == 1 | class == 2)  #df에서 class가 1인 것과 2인 것을 함께 출력
df %>% filter(class == 1 & math >= 50)
df %>% filter(class == 1 | class == 2 | class == 3)
df %>% filter(class %in% c(1,2,3))   #위의 줄과 동일한 의미
df %>% filter(math >= 50)

2. select() : 열(변수) 추출

df

select(df, math)
select(df, math, english)
select(df, math, english, science)

df %>% select(math)
df %>% select(math, english, science)
df %>% select(-math)  #math 열만 제외

df[ ,'math']
df[ , c('math','english')]


#예제: 1반 학생 중에서 수학이 50점 이상인 학생들의 영어와 과학 성적은?
#답: df %>% filter(class == 1 & math >= 50) %>% select(english, science)

df %>% select(english, science) %>% filter(class == 1 & math >= 50)
#반대로 하면 먼저 select에서 math열이 제외되므로 에러가 발생한다
#filter와 select의 순서를 잘 보고 하자
df %>% select(english, science, class, math) %>% filter(class == 1 & math >= 50)

3. arrange() : 정렬

df %>% arrange(math)  #오름차순
df %>% arrange(desc(math))  #내림차순
df %>% arrange(class, math, english)
#class -> math -> english 순으로 데이터값 정렬
df %>% arrange(class, desc(math), english)

#예제: 반은 2반과 3반이고 수학이 50점 이상인 학생들의 영어와 과학 점수를
영어는 오름차순, 과학은 내림차순으로 정렬
#답: df %>% filter(class == 2 | class == 3 & math >= 50) %>% 
select(english, science) %>% arrange(english, desc(science))

4. mutate() : 칼럼(변수) 추가

#mutate : 있던 것에서 새로운 것을 만드는 것 (앞에 있던 것을 변경하여 새로운 열 만들기)

df %>% mutate(math+english+science)

df %>% mutate(total = math+english+science)  #칼럼 이름 만들기
df %>% mutate(mean = (math+english+science)/3)  #평균값

df %>% mutate(total = math+english+science,
              mean = (math+english+science)/3)
df %>% mutate(total = math+english+science,
              mean = total/3)
  • ifelse(참 거짓의 조건,참일 때,거짓일 때)
df %>% mutate(test = ifelse(science >= 90, "pass", "fail"))

5. summarise() : 요약하기 (통계치 산출)

#수학 점수의 평균 구하기
mean(df$math)
df %>% summarise(수학평균 = mean(math))  #summarise라는 함수 안에 mean()이라는 함수가 들어감

#반별 수학 점수 평균 구하기
df1 <- df %>% filter(class == 1)
mean(df1$math)  #1반의 수학 점수 평균

df2 <- df %>% filter(class == 2)
mean(df2$math)  #2반의 수학 점수 평균

df %>% filter(class == 3) %>% select(math) %>% mean()
df %>% filter(class == 3) %>% select(math) %>% summarise(mean(math))  #3반의 수학 점수 평균

mean(df %>% filter(class == 3) %>% select(math))
#mean()함수의 괄호 안의 값이 수치형 또는 논리형이 아니므로 에러 발생

df %>% filter(class == 3) %>% select(math)
#3반의 math 점수가 데이터 프레임으로 출력됨

test <- df %>% filter(class == 3) %>% select(math)
mean(test$math)  #test에 할당한 후 mean()함수를 실행하면 평균값 계산 가능

#데이터를 입력할 때 "입력 값이 어떤 형태인지" 주의 깊게 확인해야한다
  • group_by() : "~~별"로 정렬
    -summarise는 항상 group_by와 함께 사용
    -summarise 뒤에 들어갈 수 있는 함수는 정해져있다(아무거나 X)
    ㄴmean(), sum(), mix(), max(), n()(빈도를 의미) ...

    #반별 수학 평균
    df %>% group_by(class) %>% summarise(수학평균 = mean(math))
    
    #반별 영어 최고득점 점수
    df %>% group_by(class) %>% summarise(최고득점 = max(english),
                                        수학평균 = mean(math),
                                        학생수 = n())
    
  • mpg (연비)

    library(ggplot2)
    mpg
    
    #예제: 새로운 칼럼-평균주행연비 를 만들어 주세요.
    #답:
    mpg %>% mutate(평균주행연비 = (cty+hwy)/2)
    mpg %>% select(manufacturer, model, displ, year, cty, hwy) %>%
      mutate(평균주행연비 = (cty+hwy)/2) %>% arrange(desc(평균주행연비))
    
    mpg <- mpg %>% select(manufacturer, model, displ, year, cty, hwy) %>%
      mutate(평균주행연비 = (cty+hwy)/2) %>% arrange(desc(평균주행연비))
    
    #예제: 제조사별 도시주행연비의 평균은?
    #답:
    mpg %>% group_by(manufacturer) %>% 
      summarise(평균도시주행연비 = mean(cty)) %>% arrange(평균도시주행연비)
    
    #예제: 제조사별, 모델별 도시주행연비의 평균은?
    #답:
    mpg %>% group_by(manufacturer, model) %>% 
      summarise(연비평균 = mean(cty))

    데이터 프레임 합치기-join(dplyr 함수)

1. left_join(df1, df2, by='...')

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

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

test1
test2

left_join(test1, test2)  #test1과 test2를 합침
left_join(test1, test2, by='id')  #정확한 기준점 제시
df
exam <- df
name <- data.frame(class = c(1,2,3,4,5),
                   teacher = c("Park","Kim","Choi","Jeong","Lee"))
name

left_join(exam,name,by='class')  #exam과 name 두개의 데이터 값을 join
#join한 것 보다 exam, name따로 저장하는 것이 메모리가 적게 듬
#저장 형태에 따라 - 표, 데이터 프레임, 테이블

df <- left_join(exam,name,by='class')

2. right_join()

right_join(test1, test2)
#각각 데이터 값이 5개, 5개-같은 수라서 left_join과 동일한 결과 도출


test3 <- data.frame(id = c(1,2,3,4,5),
                    midterm = c(60,80,70,90,85))

test4 <- data.frame(id = c(4,5,6,7),
                    final = c(70,83,65,95))

test3
test4

left_join(test3, test4, by='id')
right_join(test3, test4, by='id')
full_join(test3, test4)
  • midterm을 test로 변경

    test1
    test2
    
    #방법1
    colnames(test1)[2] <- 'test'
    test1
    
    #방법2
    colnames(test1) <- c('id','test')
    test1
    
    #방법3
    test1 %>% rename(test = midterm)
    test2 %>% rename(test = final)
    test2 <- test2 %>% rename(test = final)
  • bind(dplyr 함수); 묶는다

    bind_cols(test1, test2)  #열(cols)을 기준으로
    bind_rows(test1, test2)  #행(rows)을 기준으로

3. 두 데이터 프레임 합치기 - merge(R 함수)

  • merge(df1, df2, by='...', all.x=TRUE)
    -all.~ = TRUE : '~'부분만 살려서 합침

    -inner_join(df1,df2,by='',all=FALSE) : 교집합만 살림
    -left_join(df1,df2) : 왼쪽만(df1) 살림
    -right_join(df1,df2) : 오른쪽만(df2) 살림
    -full_join(df1,df2) : 두개 다(df1,df2) 살림

0개의 댓글