사용자 정의 함수 구조

변수명 : udf = user defined function #임의가능
udf = funtion(x) {
    result = f(x) #실행코드
    return(result) #반환값
}

#udf사용하기
udf(3,5,9,...,x에 넣어줄값들)


#기초 응용
문제1. 표준화 udf만들기
udf=function(t) {
    result=((t-mean(t))/sd(t))
    return(result)
}

문제2. minmax정규화 udf만들기
udf=funtion(t){
    result=(t-min(t))/(max(t)-min(t))
    return(result)
}

#심화응용
udf = fuction(x) {
    sum(is.na(x)
}

apply(df, MARGIN=2, FUN=function(x){sum(is.na(x))])

#걸측치 개수 확인 코드 #열기준 일괄확인


데이터 전처리 중
데이터 병합 관련 R함수들


rbind() #아래로 병합 #r=row
cbind() #옆으로 병합 #c=col


dplyr 패키지 활용한 데이터 병합

inner_join(df_a, df_b, by=c("x"="y") #교집합
#새로운 결측치가 생성되지는 않음

left_join(df_a,df_b, by=c("member"="name")
#df에 따라 연결되는 속성명이 다를수도 있음

#응용 기초 실습
bike.csv 데이터셋 이용

문제 : 여름과 겨울 시간대별 casual 평균 비교시,
가장 큰 차이나는 시각?
답:19

#시간을 다루므로 새로운 변수 'hour"추가
df[,"hour"] = hour(df$datetime)

#여름과 겨울에 대한 정보 얻기
unique(df$season) #여름은 2, 겨울은 4

#여름과 겨울별로 데이터 프레임 나누기
df_2=df[df$season==2, ] #여름
df_4=df[df$season==4, ] #겨울

#각각 casual 평균 계산하기
agg_2=aggregate(df_2, casual~hour, FUN=mean)
agg_4=aggregate(df_4, casual~hour, FUN=mean)

#각각 구한 평균값 합치기
#차이 구하기위해 열로 합치기
agg_bind=cbind(agg_2, agg_4)

#각 평균값의 차이에 대한 새변수 만들고 값 구하기
agg_bind[, "diff"]=agg_bind[,2]-agg_bind[,4]

max(df$diff] #최대값구하기

#응용 심화실습
문제: 비가온날 30도 넘는 시각의 casual평균? 답 95.5
여기서 비가온날은 humidity 최대값이 100이 된날.

#날짜를 다루므로 새변수 추가해주기
df[,"date"]= date(df$datetime)
head(df, 10) #데이터 학인
#같은날에도 humidity값이 여러개임

#즉, 날짜별 humidity 최대값 정리해서
#100인지 확인 필요
df_100=aggregate(humidity~date, df, FUN=max)

#비가온날 만 정리 = humidity==100 있는날
df_100_h=df_100[df_100$humidity==100, ]

#기존데이터랑 교집합으로 결합
df_rain = inner_join(df, df_100_h, by=c("date"="date")))

#문제 조건의 평균구하기
mean(df_rain[df_rain$temp>30, "casual"])



자주사용하는 기본 함수 총정리

데이터셋 가져오기

df=read.csv("파일명.csv") #csv파일 가져오기

data(데이터명) # R내장 데이터셋 가져오기

 

 

print(객체) #객체를 콘솔창에 출력

cat(객체, 객체..) #객체들을 연결해 콘솔에 출력

 

데이터 변경하기

rm(변수)#변수삭제

append(원본벡터, 추가벡터, 위치) #append(c(1,2,5,6), c(3,4), 3) #결과 1 2 5 3 4 6 

split(문자열벡터, 기준) #데이터 기준따라 분리 

 

order(벡터) #순서값 부여

sort(데이터명) #데이터 정렬

 

데이터 확인

class(객체) #물리적 자료형 확인

mode(객체) #추상적 자료형 확인

summary(데이터명) #데이터 기초 통계량 #summary(model) 모델학습결과 산출

 

length(벡터) #벡터 길이(원소개수) 산출

nrow(데이터) #행개수

ncol(데이터) #열개수 

 

table(객체) #도수 분포표

table(객체1, 객체2) #이원 분할표

prop.table(table) #도수분포표 범주별 비율 계산 #내부 반드시 table인자

 

데이터 조작하기

which(조건) #조건만족하는 위치 출력

which.max(조건) #조건만족하는 최대값 위치 출력

which.min(조건) #조건만족하는 최소값 위치 출력

 

aggregate(데이터, by="기준열", FUN=적용함수) #기준열 기준으로 함수 적용

aggregate(formula(정리열~기준열), 데이터, FUN) 

 

 

문자열 다루기

nchar("문자열") #문자열 길이반환 #number of character

paste("문자","문자"...,sep="&") #문자열을 sep구분자로 연결

substr("문자열", 3,5) #문자열을 3번째부터 5번째까지 추출

strsplit("문자열",구분자) #문자열을 구분자 기준으로 분리

sub("대상문자열,"변경문자열", "원본문자열") #원본문자열에서 대상문자열 찾아 변경 문자열로 한번변경

gsub("대상문자열,"변경문자열", "원본문자열") #원본문자열에서 모든 대상 문자열찾아 변경문자열로 대치

grep("찾을문자열", "원본문자열") #원본문자열에서 찾을 문자열이 포함된 문자열 혹은 인덱스 출력

 

 

날짜데이터 다루기

Sys.Date() #현재 날짜 데이터 

as.Date() #데이터 타입을 날짜 형식으로 변환

format(Sys.Date(), format=%m%d%y) #현재 날짜를 지정형태 문자열로 변환

format(Sys.Date(), '%a') #조회

    %a : 요일조회

    %b : 축약된 월이름 조회

    %B : 전체 월이름 조회

    %d : 일(2자리) 조회

    %m : 월(2자리) 조회

    %y : 연도(2자리) 조회

    %Y : 연도(4자리) 조회

 

 

 

리스트(list)

-벡터, 데이터프레임, 배열, 함수 등 모든 객체 담을 수 있는 데이터 구조

-(키, 값) 형태

-각 개체에 이름 지정해서 저장가능, 저장할 객체들 길이 달라도 무방

 

1. 리스트 생성

list(키1=값1, 키2=값2,..)

 

v1= c("a","b")

v2=c(T,F,F)

v3=data.frame(subject=c("a","B"), class=c("1","2"))

변수명 = list(키1=v1,키2=v2,키3=v3)

 

2.리스트에서 원소 추출

a$v1 #a리스트에서 키값이 v1에 해당하는 원소 출력

a[2] #a리스트에서 2번째 키값에 해당하는 원소 출력

a[["v1"]] #v1이라는 키값의 원소 출력

 

 

 

배열(array)

-배열은 3차원 이상까지 확장된 형태의 다차원 데이터

 

1. 배열 생성

array(데이터, dim=c(행의수, 열의수, 매트릭스수), dimnames=list(~))

array(1:27, dim=c(3,3,3), dimnames=list(c("1행","2행","3행"), c("1열","2열","3열"),c("1행렬","2행렬","3행렬"))

 

데이터프레임

-벡터들의 모임

-서로 다른 데이터 타입 가질수 있음

-데이터 분석에 가장 많이 사용되는 데이터 타입

 

 

 

1. 데이터프레임 생성

data.frame(변수병=벡터, 변수명=벡터.., stringsAsFactors= TRUE or FALSE)

data.frame(성 =c("김","이","허"),  이름 =c("가나","다라","마바"))

 

#stringsAsFactors 지정안하면 기본값 FALSE로 문자열은 문자형으로 저장,

#TRUE 문자열이 팩터형으로 저장

 

df=read.csv("파일명.csv") #csv엑셀파일 불러오는 경우

 

 

 

2. 데이터프레임내 원소 추출

방법1 : [행,열] 이용

df[1,2] # 1행2열 원소 출력

df[-1] #1행 제외한 데이터 출력

df[,2] #2열의 모든 행 출력

 

방법2 : df$열(변수)명 이용

df$a #df데이터의 a열 출력

 

 

 

3.열 이름 출력 및 이름 지정

colnames(df) = c("A","B","C") #df의 열이름 A,B로 지정

 

#특정열만 이름지정

colnames(df)[2:3]=c("B","C") #2번째부터 3번째 열까지 열이름 B,C순서로 지정

 

#df내 있는 모든 열이름 순서와 함께 출력

t(t(colnames(df)))

 

 

4.데이터 결합

rbind(df1, df2) #행으로 결합 #r =row의미

#아래로 붙여주기 #열수 같아야함.

 

cbind(df1,df2) #열로 결합 #c=col의미

#옆으로 붙여주기 #행수 같아야함.

 

merge(df1, df2, by="연결 기준 열") #데이터 병합 

 

 

 

5.데이터 조건별 조회

df[조건,]

df[df$a==4,] #a열 값이 4인 행들만 추출

 

subset(df, a==4, select=c(b,c)) #df 데이터프레임에서 a열 값이 4인 행들의 열 b, 열c 데이터들조회

 

 

 

6.데이터프레임 데이터 확인

str(df) #데이터프레임 구조 확인 : 행개수,열개수, 변수이름, 변수데이터타입..

head(df, 6) #데이터 상위 6개 확인

tail(df,2) #데이터 하위 2개 확인

 

 

7. 데이터프레임내 데이터 다루기

df = na.omit(df) #데이터프레임내 na값 있는 행 삭제

df[,"새변수"]=값 #데이터프레임내 새변수 열 생성후 값 입력

 

 

 

 

 

행렬

-2차원의 벡터로 이루어진 행과 열의 수가 지정 구조의 데이터 타입

-벡터와 마찬가지로 한 행렬은 한가지 유형의 데이터타입만 저장 가능

 

 

 

1. 행렬생

matrix (데이터, 행의수, 열의수, 행렬데이터입력순서(T행우선,F열우선), 각차원이름)

matrix(1:9, nrow=3, ncol=3, byrow=TRUE, dimnames=list(c("1","2","3"), c("a","b","c")))

#결과:

   a b c

1 1 4 7

2 2 5 8 

3 3 6 9

 

 

 

2.행렬 확인 및 지정

dim(x) = c(3,3) #x행렬에 3x3 차원 지정

nrow(x) #행수 확인

ncol(x) #열수 확인

 

 

 

3.행렬의 원소 추출 및 접근

x[3,3] #3행 3열 원소 추출  

x[3, ] #3행 추출

x[-3,] #3행 제외 나머지 행 추출

x[ ,3] #3열 추출

x[ ,-3] #3열 제외 나머지 열 추출

 

 

 

4.행렬의 각 차원 이름 확인 및 지정

dimnames(x) = list(c("R1","R2","R3"), c("a","b","c")))

 

 

 

5.행렬 이름 출력 및 지정

rownames(x) = c("r1","r2","r3") #행이름부여

colnames(x)= c("a","b","c") #열이름부여

 

 

 

6.행렬의 연산

- 각행렬 혹은 행렬끼리는 사칙 연산이 가능하다.

t(x) : 전치 행렬 반환

diag(x) : 대각원소 반환

solve(x) : 역행렬 반환

a행렬 %*% b행렬 : 행렬간 곱셈

 

 

 

 

 

 

 

벡터

- 한 벡터안에는 같은 데이터 타입 원소만 저장 가능하다.

 c( 1,2,3) #numeric 

 c( 1,2, "가") #character 문자형이 하나라도 들어가면 모두 문자형으로 바뀐다.

 

1. 벡터생성 

vec = c( 값, 값, 값. ..)

vec = c(1:3) # c(1,2,3)과 동일

vec = rep(x, times, each) #x를 times만큼 반복, 벡터에포함된 원소는 each만큼 반복

vec = seq(from, to, by) #from에서 to까지 by씩 증가 수열

 

 

2.벡터 접근 #인덱싱

- 대괄호 [] 

v[3] #v벡터의 3번째 값 반환

v[-3] #v벡터의 3번째 값 제외 나머지 원소 반환

v[v>3] #조건문 만족하는 벡터만 반환 

v[2:4] #2번째부터 4번째까지 원소 반환

 

 

3.벡터의 계산

*재활용 규칙 : 벡터간 연산시 각 위치 원소 대응이 되지않을때,

원소가 적은 벡터가 계산에 반복사용됨

a= c(1,2,3,4)

b=c(1,2)

a+b #계산과정

#(1 2  3 4) 

#(1 2)(1 2) 

2  4   4 6 #결과 

 

 

4.기초통계

mean(vec) #평균  / sum(vec) #합계

max(vec) / min(vec) / median(vec) #중앙값 

abs(vec) #절대값 / log(vec) #로그 / sd(vec) #표준편차

var(vec) #분산 / cov(vec) #공분산 / cor(vec) #상관계수

length(vec) #변수길이값(벡터내 원소갯수)

 

- code실행 : ctrl+enter 또는 ctrl+R 또는 F5 

- ; : 명령어 끝 의미. 코드 ; 코드 로 한줄로 사용가능

- 변수 지정 : df <- 또는 = 등등 사용가능

#변수명은 알파벳, 숫자, '_', '.' 사용가능' #-'사용불가. 

 

1. 패키지설치

install.packages("패키지명") #패키지설치

library(패키지명) #패키지로드

 

2.기초 연산자

== : 좌우 값이 같은지 비교 #결과 TRUE/FALSE

!= : 좌우 값이 다른지 비교. 또는 <> #결과 TRUE/FALSE 

! : 논리부정

| : 논리 or # shift+ \ 

& :논리 and

~ : formula #식의미

 

3. 팩터형 자료

- 범주형 자료 표현위한 데이터 타입

- 함수 : factor(데이터, 구분하고자하는 범주목록, 범주별 표시값, 순서형|명목형지정)

    factor( c("A","A","B","B","B") , levels = c("A","B"), labels = c("상","하"), ordered = F)

#결과 : 하  하  상  상  상  

             levels : 상 하

 

4. 데이터 타입확인 및 변환

-데이터 타입 확인 : mode(객체명) 또는 is.%%%(객체명)

-데이터 타입 변환 : as.%%%(객체명)

numeric #숫자형 / integer #정수형 /  double #실수형

character #문자형 / factor 팩터 / logical 논리형 / null  / na 

 

 

 

#참고 #주요패키지

caret

car

caTools

cluster

lubridate

ggplot2

dplyr

Metrics

FNN

rpart

e1071

+ Recent posts