[R] if문 / 이상치데이터
2022. 10. 9. 12:57ㆍDev.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 |