상세 컨텐츠

본문 제목

R Scripts : 2. 함수 (Function)

빅데이터/R with Database Fundamentals

by datasa 2023. 10. 6. 09:34

본문

# II. 함수(function) ----

## 1. 출력함수, print() & cat() ----

# 1) display의 차이
print("R programming")
# X : print("R","programming")
# 스칼라(data가 1개)값만 출력

cat("R","programming", "~~")

# 2) 자동개행
print("R");print("programming")  # ok
cat("R");cat("programming");cat("~~") # not ok

# cat 자동개행

cat("R","\n","programming", "~~")
cat("R","\n","programming","\n","~~")

cat("R","programming", "~~",fill=1)

# 3) return 값 차이

print("R programming") |> length()  # ok 
cat("R","programming", "~~") |> length() # not ok

hong <- print("R programming");hong
hong2 <- cat("R","programming", "~~");hong2

## 2. 문자처리함수, paste() ----

h1 <- "hello";h1;length(h1)
h2 <- "R";h2;length(h2)
h3 <- "Programming~";h3;length(h3)
h4 <- c(h1,h2,h3);h4;length(h4)  #  벡터

# 오류 : h1+h2+h3
paste(h1,h2,h3)
paste(h1,h2,h3) |> length()
paste(h1,h2,h3,collapse = "@") 
#+ 이미 스칼라 data이기 때문에 collapse 반영안됨됨

paste(h4,collapse = " @ ")
paste(h4,collapse = " ^^ ")
paste(h4,collapse = "")
paste(h4,collapse = " ")  # 벡터 => 스칼라

# 서수표기

c(1:12)
c(1:12) |> length()
c(1:12) |> class()
paste(1:12)
paste(1:12) |> length()
paste(1:12) |> class()

paste(1:12,c("st","nd","rd",rep("th",9)))
paste0(1:12,c("st","nd","rd",rep("th",9)))

## 3. 내장함수(built-in function) ----
# dts: https://sesoc.tistory.com/202, ss_exam.csv
getwd();rm(list=ls());rm(mx2);ls()

# dts import & 속성조회
#+ cdhlmnstrV
mx <- read.csv("dts/ss_exam.csv")

class(my_exam);class(mx)
class(mx$database)
dim(mx)
head(mx)
length(mx);length(mx$class)
# mode(mx)
# mode(mx$class)
names(mx)
str(mx)
summary(mx)
tail(mx,12)
rownames(mx)
View(mx)

# dts[]
# dts[숫자] => dts[index]
# dts[숫자, 숫자] => dts[행, 열]
# dts[조건식, 열] => dts[where, select]  # *

# SQL>
# select 컬럼명1, 컬럼명2, 컬럼명3, ...
# from 테이블명(data.frame)
# where 조건식;

# mx
#+ index 방식(1개열일 경우)
mx[4]             # 4번째 컬럼조회회(형식유지)
mx[4] |> class()

#+ 행,열 방식(1개열일 경우)
mx[2,]            # 2행 전체 조회
mx[,2]            # 2열 조회(형식X)
mx[2,] |> class() # 행개념의 접근은 형식유지(O)
mx[,2] |> class()

mx[3,5]           # 3행, 5열
mx[3,5] |> class()

# index 방식: 3열과 5열
mx[c(3,5)]
mx[c(3,5)] |> class()

?c()
c(mx[3],mx[5]) |> class()
ant <- c(mx[3],mx[5])
View(ant)
  
# 3행과 5행 전부조회
mx[c(3,5),]
mx[c(3,5),] |> class()

# 컬럼명으로 조회
names(mx)
mx[c("database","eng")] |> tail(4)
mx[c("database","eng")] |> class()


## 4. 내장함수 조건부 조회(conditional selection)----
# 조별로 제출(조원명 기재): jwc@softsociety.net

# 1) 일본어 점수 >= 90 조회
# 2) 일본어 점수 >= 90이고, 영어 < 70 조회
# 3) 영어 >= 60인 id의 database와 java 조회

## 5. 외장 패키지 함수활용 ----

# 1) beepr
install.packages("beepr")
?beepr::beep()
beepr::beep(1)
beepr::beep(2)
beepr::beep(3)
beepr::beep(4)
beepr::beep(5)
beepr::beep(6)
beepr::beep(7)
beepr::beep(10)
beepr::beep(11)

# 2) sqldf
install.packages("sqldf")

# SQL (구조화된 질의어)
#+ DQL: 질의어 (5가지 대수학 언어) ***
#+      => select (.. join.. union... minus..)
#+ DDL: 데이터구조 정의어
#+      => create, alter, drop
#+ DML: 데이터 조작어
#+      => insert, update, delete
#+ DCL: 데이터 컨트롤 언어
#+      => grant, revoke
#+ TCL: 트랜잭션 컨트롤 언어 (all or nothing)
#+      => 트랜잭션 : 업무의 단위
#+      => commit, rollback

mp <- ggplot2::mpg
class(mp)
# SQL> create table mp as select * from mpg;

# selection
mp[,c(2,4)] |> head(3)

names(mp)
sqldf::sqldf("select model, year
from mp limit 3")

sqldf::sqldf("select model, year
from mp limit 3") |> names()

# 컬럼 2개를 붙이기: manufacturer, cty 

sqldf::sqldf("select 
                    manufacturer|| '=> ' ||cty
                    as 제조사_연비
            from mp") |> head(10)

# 3) plot

names(mp)

# default plot()
plot(x=mp$cty)
plot(x=mp$hwy)
plot(x=mp$cty, mp$hwy)

# ggplot2::qplot()
search()
ggplot2::qplot(data=mp, x=cty)
ggplot2::qplot(data=mp, x=hwy)
ggplot2::qplot(data=mp, x=cty, y=hwy)

# ggplot2::qplot() + a
names(mp)
head(mp$drv)
ggplot2::qplot(data=mp, x=drv, y=hwy)
ggplot2::qplot(data=mp, x=drv, y=hwy, geom="boxplot")
ggplot2::qplot(data=mp, x=drv, y=hwy, 
               geom="boxplot", col=drv)

## 6. 사용자 정의 함수----

# 0) 평균과 합계를 구하는 함수
names(mx)
sum(mx$java)
sum(mx$java)/length(mx$java)
mean(mx$java)

# 1) 사용자함수 + print()
minseo <- function(a){
 m_sum <- sum(a)
 m_avg <- m_sum / length(a)
 
 print(m_sum); print(m_avg)
}

ms <- minseo(mx$database)
ms
?print()

# 2) 사용자함수 + cat()
minseo2 <- function(a){
 m_sum <- sum(a)
 m_avg <- m_sum / length(a)
 
 cat(m_sum);cat("\n");cat(m_avg)
}

ms2 <- minseo2(mx$database)
ms2

# 3) 사용자함수+ cat()+ return()

minseo3 <- function(a){
 m_sum <- sum(a)
 m_avg <- m_sum / length(a)
 
 cat(paste0("합계: ", m_sum),
     paste0("평균: ", round(m_avg,2)), fill=1)
 
 return(list(ms_sum=m_sum, ms_avg=round(m_avg,2)))
}

ms3 <- minseo3(mx$database)
ms3

ms3$ms_sum
ms3$ms_avg
View(ms3)

## 7. 빈도 함수 ----

# 1) number data

num_bdata <- c(1,1,1,2,2,3,4,4,4,5,5)
class(num_bdata)
sum(num_bdata)         # 32

# 빈도
table(num_bdata)
sum(table(num_bdata))  # 11

# 비율
prop.table(num_bdata) |> sum()
prop.table(num_bdata)
5/32      # 해당 변수의 크기 /전체합
prop.table(table(num_bdata))
2/11  # 숫자 5의 빈도합 / 총 빈도수
prop.table(table(num_bdata))*100

# plot
num_bdata
hist(num_bdata)
ggplot2::qplot(num_bdata)

table(num_bdata)
hist(table(num_bdata))
ggplot2::qplot(table(num_bdata))

# 2) character data

abc <- c("a","b","c")
c_bdata <- rep(abc, c(3,2,1))

class(c_bdata)
typeof(c_bdata)
table(c_bdata)
#-X sum(c_bdata)

table(c_bdata) |> sum()
table(c_bdata) |> prop.table()
table(c_bdata) |> prop.table() |> sum()
#-X prop.table(c_bdata)

# plot
#-X hist(c_bdata)
?hist()
table(c_bdata) |> hist()
ggplot2::qplot(c_bdata)

## 8. table() 옵션 ----

t1 <- c(NULL, "a","a", NULL, "b","c");t1

table(t1)
table(t1,useNA = 'no')  # default 옵션
table(t1,useNA = 'ifany')
table(t1,useNA = 'always')

t2 <- c(NULL, "a","a", NULL, "b","c", NA, NA);t2

table(t2)
table(t2,useNA = 'no')  # default 옵션
table(t2,useNA = 'ifany')
table(t2,useNA = 'always')

# plot
table(t1,useNA = 'ifany')|> ggplot2::qplot()
table(t2,useNA = 'ifany')|> ggplot2::qplot()

t1 |> ggplot2::qplot()
t2 |> ggplot2::qplot()

## 9. NULL/NA/NaN/INF ----

# NaN

log(1000)
log(-1000)

# Inf
# 연산가능: -10^308 ~ 10^308

10**2
10^2
10^10
-10^309

# NULL과 NA
n1 <- c(1:3,NULL, NULL)
n1;length(n1)

n2 <- c(1:3,NA, NA)
n2;length(n2)

# 연산
n1;n1+1;n1+NA;n1+NULL
n2;n2+1;n2+NA;n2+NULL
3+NA;3+NULL

# sum
sum(n1)  # NULL 무시, 연산(o)
sum(n2)  # NA 중요, 연산(x)
sum(n2, na.rm = T)












'빅데이터 > R with Database Fundamentals' 카테고리의 다른 글

R Scripts : 3. 리스트 (List)  (1) 2023.10.06
R Scripts : 1. 변수 (Variables)  (1) 2023.10.04
RF7_Test dataset sample  (0) 2023.09.15

관련글 더보기

댓글 영역