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를 선호
#특정 부분만 보고 싶은 경우
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) #데이터 요약 통계량 출력(최소값, 최대값 등을 알 수 있음)
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)
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)
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))
#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)
df %>% mutate(test = ifelse(science >= 90, "pass", "fail"))
#수학 점수의 평균 구하기
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))
#중간고사 데이터 생성
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')
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)을 기준으로
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) 살림