12. if{} else if{} else{}로 aggregate(특정칼럼, by=list(기준칼럼), 통계) 흉내내기 + 조건별 문자열 출력해주기
# 데이터 준비
mtcars
str(mtcars)
head(mtcars)
# aggregate()를 이용한, cyl칼럼에 따른, mpg칼럼의 평균값들
aggregate(mtcars$mpg, by=list(mtcars$cyl), mean)
#### ***사용자 정의함수 + if문을 이용해서 aggregate()흉내내기*** ####
# udf의 ()인자에 cyl칼럼이 들어갈 것임...
# 그값이 4, 6, 8일 때,, 그 row들을 인덱싱해서 mpg의 평균
# 만약 함수안에서 변수에 안담기고 함수식만 있다면 -> R은 알아서 return을 해주는 기능이 있다. 변수에 담그면 반드시 return()
mean_by_cyl <- function(x){
if(x == 4){
# aggregate로 쓸 경우 : aggregate(mtcars$mpg, by=list(mtcars$cyl), mean) [1, 2]
return( mean( mtcars[ mtcars$cyl == 4, "mpg"] ) )
}else if(x == 6){
return( mean( mtcars[ mtcars$cyl == 6, "mpg"] ) )
}else if(x == 8){
return( mean( mtcars[ mtcars$cyl == 8, "mpg"] ) )
} else{
print("잘못 입력되었습니다. 4 or 6 or 8 중에 입력해주세요")
}
} # if문 끝
mean_by_cyl(4)
mean_by_cyl(6)
mean_by_cyl(8)
mean_by_cyl(7)
# 4, 6, 8은 들어오는 값이니 x로 대체하기
# my) 4 or 6 or 8 인 경우를,,, %in% 으로 대체하기***
mean_by_cyl <- function(x){
if(x %in% c(4, 6, 8)){
return( mean( mtcars[ mtcars$cyl == x, "mpg"] ) )
}else{
print("잘못 입력되었습니다. 4 or 6 or 8 중에 입력해주세요")
}
} # if문 끝
mean_by_cyl(4)
mean_by_cyl(6)
mean_by_cyl(8)
mean_by_cyl(7)
#### **** if문을 써서 aggregate()를 흉내낼 때의 장점 -> 경우의 수별로 문자열 띄울 수 있다.####
# *** return( '문자열', 변수, '문자열') 처첨 섞인 경우에는
# 바로 return 안되므로 paste로 묶어서 하나로 return한다 ***
# *** round( a, 2) --> 소수점 2번째 자리**까지** 표시
mean_by_cyl <- function(x){
if(x == 4){
a <- round(mean( mtcars[ mtcars$cyl == 4, "mpg"] ), 2)
return( paste0('The avg mile per gallon of ', x, ' cylinder car is ', a))
}else if(x == 6){
a <- round(mean( mtcars[ mtcars$cyl == 6, "mpg"] ), 2)
return( paste('The avg mile per gallon of ', x, ' cylinder car is ', a, sep=''))
}else if(x == 8){
a <- round( mean( mtcars[ mtcars$cyl == 8, "mpg"] ) , 2)
return( paste('The avg mile per gallon of ', x, ' cylinder car is ', a, sep=''))
} else{
print("잘못 입력되었습니다. 4 or 6 or 8 중에 입력해주세요")
}
} # if문 끝
mean_by_cyl(4)
mean_by_cyl(6)
mean_by_cyl(8)