[R 기초] 데이터 다루기

2020. 10. 18. 15:33노트/R : 통계

 

 

데이터

csv_exam.csv
0.00MB

 

 

 

연습데이터 불러오기

exam <-read.csv("Data/csv_exam.csv")
exam

라이브러리 설치

install.packages("dplyr")
install.packages("ggplot2")
library(dplyr) # 데이터정제를 위한 라이브러리
library(ggplot2) # 데이터 시각화를 위한 라이브러리 


exam %>% 
  summarise(mean_math=sum(math))

%>% : ctrl+ shift + M 단축키 

 

데이터 요약하기

exam %>% 
  group_by(class) %>% 
  summarise(mm=mean(math),
            sm=sum(math),
            md=median(math),
            cnt=n())

 

ggplot2 라이브러리에 내장된 mpg 데이터로 연습해보기 

 

mpg %>% 
  group_by(manufacturer, drv) %>% 
  summarise(mc = mean(cty))

#mpg데이터를 회사별로 그룹화, class를 suv 추출 , tot=cty와 hwy의 평균 값 
mpg %>% 
  group_by(manufacturer) %>% 
  filter(class=="suv") %>% 
  mutate(tot=(cty+hwy)/2) %>% 
  summarise(mt=mean(tot)) %>% 
  arrange(desc(mt))

# 데이터프레임 생성 

test1 <-data.frame(id=c(1,2,3,4,5),
                    midterm=c(60,80,70,90,55))
test2 <-data.frame(id=c(1,2,3,4,5),
                   final =c(70,80,40,80,75))
total<-left_join(test1,test2,by="id")
total

데이터 열 추가하기 left_join()

name<-data.frame(class=c(1,2,3,4,5),
          teacher=c("kim","lee","park","choi","cho"))
exam_new <-left_join(exam,name,by="class")
exam_new

열 병합하기 bind_rows()

test1
test2

ta<-bind_rows(test1,test2)
ta

필터링 filter()

exam %>% filter(english>=80)
exam %>% filter(class==1 & math >=50)
exam %>% filter(class %in% c(1,3,5))

컬럼 선택하기 select()

exam %>%  select(id,math)

컬럼 추가 mutate() 

# test 컬럼 추가(mutate) , english >=60 => pass, fail 

exam %>% 
  mutate(test=ifelse(english >=60, "pass","fail")) %>% 
  arrange(test)

 

 

결측치 다루기 

 

데이터 생성 

df <- data.frame(sex=c("M","F",NA,"M","F"),score=c(5,4,3,5,NA))
df

# 결측치 확인 
is.na(df)

# 결측치 확인
table(is.na(df))

table(is.na(df$sex))


# 결측치 때문에 데이터 연산이 안될 경우 

mean(df$score) #NAN (결측값 때문)
sum(df$score) #NAN (결측값 때문)

#score가 NA인 데이터만 출력 
df %>%  filter(is.na(score))

#score 결측치 제거 
df_nomiss <-df %>%  filter(!is.na(score))

mean(df_nomiss$score)
sum(df_nomiss$score)

#score, sex 컬럼에서 na가 아닌 데이터만 추출 
df_nomiss <-df %>%  filter(!is.na(score) & !is.na(sex))
df_nomiss


#결측치 없는 데이터만 추출 
df_nomiss2<-na.omit(df)
df_nomiss2

mean(df$score, na.rm=T) # 결측치 제외하고 평균 
sum(df$score, na.rm=T) # 결측치 제외하고 합계

 

# 결측치 대체하기 

 

exam[c(3,8,15),"math"]<-NA
exam

# 결측치 대체하기 
# math 열 이 na 이면 55를 대입 
exam$math <- ifelse(is.na(exam$math), 55 , exam$math)
table(is.na(exam$math))
mean(exam$math)

 

# 연습하기 

df <-data.frame(sex=c(1,2,1,3,2,1),
                score=c(5,4,3,4,2,6))
df$sex <-ifelse(df$sex==3,NA,df$sex)
df$score<-ifelse(df$score>5,NA,df$score)

df %>% filter(!is.na(sex) & !is.na(score)) %>% 
  group_by(sex) %>% 
  summarise(ms=mean(score))