R/강의복습

[22.08.10] 3일차 ( 함수만들기 / ls / rm / head / table / order / rename / function / sapply )

peach_h 2022. 8. 14. 19:32
☆ 강의 내용 요약 ☆

ls( ) : 자신이 생성한 변수들을 확인하는 함수
rm( ) : 지정한 객체를 삭제하는 함수
head(x) : 데이터의 앞부분 6개 출력
table( ) : 빈도수를 추출하는 함수
order( ) : 데이터 정렬 함수
rename( ) :컬럼명을 바꾸는 함수
sapply( 데이터, 함수) : 데이터의 각 행, 열에 대한 연산을 계산하는 함수 

 

# exam 자료 활용하기
## df2에 exam 파일 불러오기
getwd()
setwd("c:/r_worksplace/Data")

df2 <- read.csv("csv_exam.csv")

head 함수로 df2 살펴보기
1, 3,5번째 컬럼만 골라서 새 데이터프레임 만들기
colnames함수를 이용해서 컬럼 이름바꾸기
번호 컬럼을 ID로 변경

 

 

# woman 파일 활용하기

 

새로운 파일은 항상 head로 확인해볼것 !
ls함수를 이용해 변수들 확인. woman을 지운후 제대로 지워졌는지 확인함
rm 함수로 지정한 변수를 모두 지웠다

 

 

# diamonds 자료 활용하기
#모듈 불러오기 
install.packages('ggplot2')
library(ggplot2)
#diamonds 파일을 dia 변수로 지정
dia <- ggplot2::diamonds

dia 파일 미리보기

(1) 각 커트별로 빈도수 카운트 하기

 

table 함수로 cut 컬럼의 빈도수 확인

 

(2) 각 컬러별 빈도수 카운트 하기

 

(3) 각 clarity별 빈도수 카운트

 

 

(4) cut가 premium인 가격의 평균 값

 

dia에서 price열에서, cut열 중 premium인 자료만 추출함
factor는 mean과 같은 수학 연산이 불가능함. numeric으로 데이터 타입을 바꾼 후 평균 가격을 추출함.

 

(5) (4)에서 상위 123위와 하위 123위

 

order 함수를 이용해 내림차순으로 정렬해서 상위값 추출 / 오름차순 정렬 후 하위값 추출

- order 함수 부분을 인덱스로 묶지 않으면 ??

  order함수의 결과는 해당 인덱스 번호로 나오기 때문에 그 값을 알수 없기때문임.

 상위 1,2,3위를 추출하면 그냥 1,2,3번으로 나옴 !

 

cut이 Premium, VeryGood인 다이아 추출

 

 

cut이 Premium, VeryGood, Good인 다이아 추출

 

* a %in% b : a에서 b가 포함된 자료를 추출 

 

 

# mtcars 자료 활용하기

plot(mtcars$wt, mtcars$mpg) mtcars의 wt와 mpg 컬럼의 산포도

# rename 함수 쓰려면 dplry 라이브러리가 필요하다
install.packages("dplyr")
library(dplyr)

colnames로 컬럼이름 확인
rename 함수로 컬럼의 이름들을 변경
city칼럼과 highway칼럼의 평균인 total칼럼을 추가로 만들어줌
hist(mpg2$total)

*히스토그램이란 ? 

- 도수분포표, 값이 어느 구간에 많이 속해있는지 보여줌.

연속된 데이터를 구간별로 나누고, 구간별 빈도수를 시각화한 자료.데이터 분포 특성을 파악하기 좋음

 

ggplot(mpg2, aes(x=total)) + geom_histogram(binwidth = 1)

- mpg2에서 x축을 total로 점 히스토그램을 만든것.

* ggplot(데이터프레임, aes(x축 변수, y축 변수, colour=다른색으로 표시 하고 싶은 변수))

* binwidth : x축을 나누는 bin의 너비 설정

* bins : x축을 나누는 bin의 개수 설정

 

 total이 20이상이면 pass, 아니면 fail이 뜨도록 test 컬럼 추가하기

 

table 함수로 fail과 pass가 몇번 떳는지 확인
qplot(mpg2$test)로 막대그래프 생성

 

 total이 30이상이면 A, 20이상이면 B, 20미만이면 C
mpg2$grade <- ifelse(mpg2$total>=30, "A", 
				ifelse(mpg2$total>=20, "B", "C"))

table 함수로 빈도수 확인
qplot(mpg2$grade)로 막대그래프 생성

 

 class가 suv, compact인 차종의 cty 평균 구하기
# mpg에서 class, cty 컬럼만 추출한 mpg3 생성
mpg3 <- mpg %>% select(class, cty)

# class = suv, compact만 추출
mpg_suv <- mpg3 %>% filter(class=="suv")
mpg_compact <- mpg3 %>% filter(class=="compact")

# cty 평균 구하기
mean(mpg_suv$cty )
mean(mpg_compact$cty )

결과

# midwest 자료 활용하기
# midwest 파일 가져오기
midwest <- ggplot2::midwest
write.csv(midwest, file="midwest.csv")

# rename 함수로 컬럼 이름 변경
midwest <- rename(midwest, total=poptotal, asian=popasian)
# ratio 칼럼 추가 ratio = 아시아인구수/총인구수*100
midwest$ratio <- midwest$asian/midwest$total*100

hist(midwest$ratio)

아시아인구 비율이 평균 이상이면 large, 이하면 small 표시하기
# ratio의 평균 값 지정
m <- mean(midwest$ratio)

midwest$group <- ifelse(midwest$ratio>m, "large", "small")

 

 

# exam 자료 활용하기

filter 함수를 이용해 2반만 추출

 총점, 평균, 90이상 A, 80이상 B, 70이상 C, 60이상 D, F
# 총점구하기
exam$total = exam$math + exam$english + exam$science
# 평균구하기
exam$avg = exam$total/3
# 등급나누기
exam$grade = ifelse(exam$avg>=90, "A", 
                    ifelse(exam$avg>=80, "B", 
                        ifelse(exam$avg>=70, "C", 
                              ifelse(exam$avg>=60, "D", "F"))))

head(exam)으로 결과 확인
filter 함수로 B등급만 추출하기

 

filter와 %in% 로 1,4,5반만 추출하기

# 1반의 반, 아이디 수학만 골라서 추출하기
exam %>% filter(class==1) %>% 
    select (class, id, math)

결과

 

# 사용자 함수 만들기
#사용자함수
#변수명 <- function(매개변수){
#    ......
#    ......
#    return (값)   괄호 생략 불가 
# }

# 90이상이면 A, 80 B, 70 C, 60 D, F를 반환하는 함수 만들기
getGrade<- function( score){
  if( score>=90)
    return ("A")
  else if(score>=80)
    return ("B")
  else if(score>=70)
    return ("C")
  else if(score>=60)
    return ("D")
  else
    return("F")
}

# 사용자 함수 활용하기
for (i in 1:20)
  exam$grade2[i] = getGrade(exam$avg[i])

head(exam)으로 결과 확인

사용자 함수로도 등급을 나눌 수 있다 !

sapply 함수로 exam$avg에 getGrade 함수를 실행하고 결과를 추출.

 짝수, 홀수 구분하는 함수 만들기
isEven <- function(num){
  if(num%%2==0)
    return (T)
  else
    return (F)
}

값 넣고 결과 확인

# x1에 1부터 100까지 중 랜덤으로 20개 값 추출
x1 <- data.frame(num=sample(1:100, 20))
# x1$even에 x1 값에 isEven적용한 컬럼 추가
x1$even <- sapply(x1$num, isEven)

 4배수면 윤년, 100배수면 윤년X, 400배수는 윤년인 함수 만들기
isLeap <- function(year){
  if(year%%4==0 & year%%100!=0 | year%%400==0)
    return(T)
  else
    return(F)
}

# 확인하기
x1 <- data.frame(year=1:2022)
x1$leap <- sapply(x1$year, isLeap)
x1[2022:1990, ]

결과

 mysum(n) 1~ n까지 합계를 구해서 반환하는 함수
mysum <- function(limit){
  s=0
  for(i in 1:limit)
    s=s+i 
  
  return(s)
}

x1<- data.frame(num=1:1000)
x1$sum <- sapply(x1$num, mysum)

결과확인

 

 

 

 

※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우