[R] if문 / 이상치데이터

2022. 10. 9. 12:57Dev.Program/Python & R

728x90

======== test3.R 만들기

# p110
# 열이름 바꾸기
df_raw <- data.frame(var1=c(1,2,1),
                    var2=c(2,3,2))
df_raw

# 복사
df_new <- df_raw
df_new

 

> 열이름을 수정하기 위해서는 라이브러리를 설치해야함!

# var2 => v2 열이름 수정
install.packages("dplyr")
library(dplyr)
df_new<-rename(df_new, v2=var2)
df_new

 

# 열추가   v1+v2 => v_sum
# df_new[열이름]<-df_new[영어]+df_new[수학] (파이썬)
df_new$v_sum<-df_new$v1+df_new$v2
df_new
  • # df_new[열이름]<-df_new[영어]+df_new[수학] (파이썬에선 이렇게 사용)

 

# v1, v2 평균 => v_mean
df_new$v_mean<-(df_new$v1+df_new$v2)/2
df_new

< if문 >

# 열이름 test : if문 사용
# v_sum 4보다 크거나 같으면 pass 아니면 fail
# ifelse(조건, 참값, 거짓값)
df_new$test<-ifelse(df_new$v_sum>=4, 'pass', 'fail')
df_new

< 중첩 if문 >

# 열추가 - 열이름 test2 : 중첩 if문 사용
# v_sum 4보다 크거나 같으면 "A" 아니면
# v_sum 3보다 크거나 같으면 "B" 아니면 "C"
df_new$test2<-ifelse(df_new$v_sum>=4, "A", ifelse(df_new$v_sum>=3, "B", "C"))
df_new

 



 

< filter 함수 >

# 행, 열 조회
# filter 함수 class 가 1인 경우만 추출(행추출)
# %>% 함수 나열
exam %>% filter(class==1)
# filter class 3이 아닌 데이터 추출
exam %>% filter(class!=3)

 

# filter class 1이면서 & math 50점 이상 데이터 추출
exam %>% filter(class==1&math>=50)
# filter math 90점 이상이거나 | english 90점 이상 데이터 추출
exam %>% filter(math>=90|english>=90)

 

# filter class 1,3,5 반 추출 %in% c(1,3,5)
exam %>% filter(class %in% c(1,3,5))
  • %in% DB 의 IN연산자 처럼 포함조건을 나타냄, c() 여러 조건 설정하는 c 함수



# p133 &  |  %in%  ^,**제곱 %/%몫  %%나머지
# 추출행 데이터 저장
exam1 <- exam %>% filter(class==1)
exam1
# 열 추출 select()
exam %>% select(math)
exam %>% select(class, english)
exam %>% select(-math) # math열 제외

 

# exam %>% class 1조건 %>% english 열 조회
exam %>% filter(class==1) %>% select(english)

 

# id, math 열 조회 앞부분 6행 head
exam %>% select(id, math) %>% head()
# 열추가 함수 mutate 데이터$열이름=
exam %>% mutate(total=math+english+science)
exam # mutate()를 저장하려면 변수에 담아야 함
# 함수 안쓸거면 원래 하던 거 처럼 이렇게 저장
exam$total = exam$math+exam$english+exam$science
# 평균 mean 추가
exam %>% mutate(mean=(math+english+science)/3)
# test science 60이상이면 "pass" 아니면 "fail"
exam %>% mutate(test=ifelse(science>=60, "pass", "fail"))



< 정렬 : arrange() >

# 정렬 p139 arrange()
# math 기준으로 오름차순
exam %>% arrange(math)
# math 기분으로 내림차순 desc()
exam %>% arrange(desc(math))
# class 오름차순 math 오름차순 arrange(class, math)
exam %>% arrange(class, math)
# class 오름차순 math 내림차순
exam %>% arrange(class, desc(math))




# 그룹 group_by()  summarize()
# 전체 수학점수 평균
exam %>% summarise(mean_math=mean(math))
# class별로 math평균
exam %>% group_by(class) %>% summarise(mean_math=mean(math))
# class 별로 math 평균mean(), 합계sum(), 중앙값median(), 개수n()
exam %>% group_by(class) %>% summarise(mean_math=mean(math), sum_math=sum(math), median_math=median(math), n_math=n())



# 전체 응용
# 그룹 class, filter class 1반 제외,
# mutate 열추가 tot=math+english
exam %>% group_by(class) %>% filter(class!=1) %>% mutate(tot=math+english+science) %>% summarise(mean_tot=mean(tot)) %>% arrange(desc(mean_tot))

 

< 합치기 : join 개념 >

# 데이터프레임 합치기
# 열 합치기, 행 합치기(병합) p151 열합치기 left_join() 행합치기 bind_rows()
# 1번학생 중간고사   1번학생 기말고사
mid_test <- data.frame(id=c(1,2,3,4,5),
                      midterm=c(60,80,70,90,85))
mid_test
fin_test <- data.frame(id=c(1,2,3,4,5),
                      midterm=c(70,83,65,95,100))
fin_test
# 기준 id : mid_test  fin_test 합치기(조인개념)
tot_test<-left_join(mid_test, fin_test, by="id")
tot_test

 

# 중간고사점수 6~10 학생 점수추가
mid_test2 <- data.frame(id=c(6,7,8,9,10),
                      midterm=c(70,80,60,90,80))
mid_all<-bind_rows(mid_test, mid_test2)
mid_all

 

# 데이터 정제 - 빠진 데이터(결측치), 이상한 데이터(이상치) 제거 p162
# 결측치 찾기
df <- data.frame(sex=c("M","F",NA,"M","F"),
                score=c(5,4,3,4,NA))
df
is.na(df) # 결측치 TRUE
table(is.na(df)) # TRUE 2
table(is.na(df$sex)) # TRUE 1
# NA 를 포함하고 있으면 NA 출력
mean(df$score) # NA
sum(df$score) # NA
# 결측치 제거
# 조건 filter 결측치제거
df %>% filter(is.na(score))
# 결측치 제거
df %>% filter(!is.na(score))
df_nona <- df %>% filter(!is.na(score))
mean(df_nona$score) # 4
sum(df_nona$score) # 16
# df_nona2   score   sex NA 없이 저장
df_nona2 <- df %>% filter(!is.na(score)&!is.na(sex))
df_nona2
# 결측치 모두 제거
df_nona3 <- na.omit(df)
df_nona3
# NA 그대로 있고 NA 빼고 계산
mean(df$score, na.rm = T) # NA 제외하고 평균 계산
sum(df$score, na.rm = T) # NA 제외하고 합계 계산
  • na.rm=T (rm:remove, T=true)
# summarise
df %>% summarise(mean_s=mean(score, na.rm = T),
                sum_s=sum(score, na.rm = T))

 

# 결측치 대체  NA => 평균 변경
mean(df$score, na.rm = T) # 4
# df_score <- ifelse(na찾기is.na(), score 평균, score)
df_score <- ifelse(is.na(df$score), 4, df$score)
df_score
  • 이렇게 대체하면 그냥 mean() 함수 안에 넣을 수 있음!

 

< 이상치 데이터 >

# filter NA 아닌 것 조회
# group_by sex
# summarize(mean_score = score평균)
df2 %>% filter(!is.na(sex)&!is.na(score)) %>%
        group_by(sex) %>%
        summarise(mean_score = mean(score, na.rm = T))
  •  

 

728x90

'Dev.Program > Python & R' 카테고리의 다른 글

[Python] list.sort() 와 sorted(list) 의 차이  (0) 2022.10.13
[R] 산점도 및 여러가지 그래프  (0) 2022.10.09
[R] 데이터 가져오기  (0) 2022.10.09
기상청 데이터  (0) 2022.10.09
여러가지 그래프  (0) 2022.10.09