Big Bro's Studying Archive

R 프로그래밍 입문 (1) 변수의 선언과 기본적인 형변환함수, 날짜함수 본문

Big Data展

R 프로그래밍 입문 (1) 변수의 선언과 기본적인 형변환함수, 날짜함수

빅브로오 2020. 4. 16. 14:01

 

R 환경설정

작업디렉토리 확인 및 변경

getwd() #라인단위 실행 ctrl + Enter (work directory)
setwd('C:/Users/백승윤/Desktop/수업')
#이렇게 설정해줘도 이번세션에서만 변경됨
#Tools Global Options에서 Defualt 디렉토리를 변경해 주면 된다.

참고
: 여러라인 주석 처리
-> Ctrl + Shift + C

변수

선언 (길어지는 변수식을 편리하게 재사용하기 위해)

R에서는 화살표를 이용해 변수를 선언한다.
처음에는 불편해보이지만 익숙해지면 쓸만하다.

v1 <- 1

변수명에도 규칙이 있다. 숫자부터 올 수 없다. 특문은 _와 .만 가능
'.'부터 시작할 경우 뒤에 숫자가 올 수 없다.
변수명 a1, b1, c1 같은 변수명 좋지는 않음.

a1 <- 1
b1 <- 2
c1 <- 3

각 위치에 스칼라 선언

sum <- a1 + b1

좋지 않은 변수명.
이미 있는 함수이기 때문에 에러나기 쉽고 찾기 어렵다.

v_sum <-a1 + b1 + c1
c2 <- 'a'
c3 <- "a   b" ; c3

변수를 연산한 변수 생성 가능.
변수에 텍스트 선언 가능

변수의 데이터 타입 확인

class함수를 통해서 확인할 수 있다.
python의 type과 같은 역할

class(v1)
class(c2)
d1 <- Sys.Date() #현재 날짜 (대소구분 하는듯)
class(d1)
d1

Sys.Date()는 현재 날짜를 불러오는 기능의 함수이다.
대소문자에 주의하도록 하자

산술연산

c1 <- '10'
a1 + b1 # numeric type 끼리 연산 가능
c1 + a1 # 문자변수와 숫자변수 연산 불가
        # 묵시적 형변환(db 만의 특징) 발생 X 
d1 + 100 #날짜와 숫자상수 연산가능

형 변환 함수

as.numeric()
as.character()
as.Date()

위에서 부터 숫자, 문자, 날짜로 형변환을 해주는 함수.

as.numeric(c1) + a1

c1은 '10'이라는 텍스트 변수인데
numeric을 통해 숫자로 변경해주면 연산 가능하다.

날짜의 형변환 및 파싱

d2 <- as.Date('2020/02/05') + 100

2월 5일에서 100일 지난 날짜인
2020-05-15가 변수에 저장

as.character(d2, '%A')       #요일
as.character(d2, '%Y/%m/%d') #네자리수 년도, 월, 일
as.character(d2, '%H/%M/%S') #시,분,초

변수에 연속적 값할당

seq1 <- 1:10

1부터 10까지의 연속된 정수 출력

'a' : 'f' #문자 연속적 출력 불가

문자는 되지 않는다.

함수의 사용 방법

substr('abcde', 2, 3)
substr('abcde', start=2, stop=3)

오라클과는 다르게 인자 이름을 전달할 수 있고
인자 이름을 지정할 경우 순서를 바꿀 수도 있다.
인자 이름 지정은 사용자 지정함수에서 설정 가능하다.

help(seq)
seq(from = 1,
      to = 1,
      by = ((to - from)/ (length.out -1)))
seq(from = 1, to = 10, by = 2)

시퀀스함수를 통해 by값을 지정하여 사용도 가능하다.

연습문제

1. 2020년 1월 1일부터 1월 31일까지 날짜를 동시 출력

d3 <-as.Date('2020/01/01')
d4 <- as.Date('2020/01/31')
d5 <- seq(from = d3, to = d4, by = 1)
as.character(d5)
d6 <- as.Date('2020/12/31')
seq(from = d3, to = d6, by = 'month')

아래는 월별로 출력. seq함수의 by값에는 날짜 단위 입력도 가능하다.

 

2. 2020년 6월 8일부터 오늘날짜까지 남은 일수 출력

as.Date('2020/06/08') - Sys.Date()

날짜는 일 단위로 연산이 이뤄진다.

특정 변수 삭제 방법

objects()        #선언된 변수 목록 확인
ls()             #선언된 변수 목록 확인
rm(list = "sum") #sum이라는 변수 삭제(remove)
rm(list = ls())  #선언된 모든 변수 삭제

산술 연산 기호

7 %/% 3 # 몫
7 %% 3  # 나머지
3^2     # 승수
3**3    # 승수
1e1     # 10
1e2     # 10의 2승
1e3     # 10의 3승
1e-2    # 10의 -2승
342e2   # 342 * 10의 2승

몫과 나머지에만 유의하면 나머지는 크게 어렵지 않다.

NA와 NULL

cat(1, NA, 2)   # 자리수 고정
cat(1, null, 2) # 없는 데이터이므로 자리수 고정 불가
sum(1, NA, 3)   # NA는 무시할 수 없음
sum(1, NULL, 3) # NULL은 무시 됨

 

NA + 1          # NA
NULL + 1        # numeric(0)

lubridate 패키지를 활용한 날짜함수 활용

R에서는 패키지를 불러와 해당 패키지 내부의 원하는 함수를 적용시킬 수 있다.
이용 목적에 따라 훨씬 편리한 이용도 가능하다.

install.packages("lubridate")
library(lubridate)

패키지 설치, 불러오기.

date1 <- now()

패키지를 불러오기 전에는 해당 함수가 없다고 나온다.

as.character(date1, '%Y') # 2020
year(date1)               #년
month(date1)              #월, 숫자형식
month(date1, label = T)   #월, 문자형식
                          #날짜 언어가 영문일떄
day(date1)                #일
wday(date1)               #요일 숫자 출력
wday(date1, label = T)    #요일 이름 출력
hour(date1)               #시
minute(date1)             #분
second(date1)             #초

date1 + months(6)         #6개월 후
date1 + years(6)          #6년 후
date1 + days(6)           #6일 뒤
date1 + hours(6)          #6시간 뒤

날짜 언어 변경

Sys.setlocale('LC_TIME', 'C') # 영문형식으로 변경
                          #세션 마다 적용됨
month(date1, label = T)   #날짜 언어가 영문일떄
Sys.setlocale('LC_TIME', 'KOREAN') # 한글

 

실습 문제

#1. 2020년 2월의 일별 데이터를 출력
그 중 v_year라는 컬럼(변수)에 년도만,
v_month라는 컬럼(변수)에 월만,
v_day라는 컬럼(변수)에 일만 분리저장
v_bonus_date 컬럼에 6개월 후 데이터를 입력

sday <- as.Date('2020/02/01')
fday <- as.Date('2020/02/29')
feb2020 <- seq(from = sday, to = fday, by = 'day')
class(feb2020)
v_year <- year(feb2020); v_year
v_month <- month(feb2020)
v_day <- day(feb2020)
v_bonus_date <- feb2020 + months(6)

v_year
v_month
v_day
v_bonus_date
class(v_year)
as.character(feb2020, '%Y')
as.character(feb2020, '%m')
as.character(feb2020, '%d')


#2. 2019년 전체 날짜를 갖는 v1 변수 생성

v1 <-seq(as.Date('2019/01/01'), as.Date('2019/12/31'), by = 'day')

#3. 위의 벡터를 년도를 제외한 월/일 형식으로만 출력하여 v2 생성

v2 <- as.character(v1, '%m/%d')

#4. '2019/04/25'일로부터 100일 뒤의 날짜와 요일 출력

dd <- as.Date('2019/04/25') + 100
wday(dd, label = T)

#5. 사원의 입사일이 다음과 같을 때 현재까지 근무일수가 몇 주, 몇 일인가 출력

v_hiredate <- c('2018/04/06', '2019/12/23', '2019/05/04')
curd <- Sys.Date(); curd
workdays <- curd - as.Date(v_hiredate)

workw <- as.numeric(workdays) %/% 7
workd <- workdays - workw *7 ; workw; workd

workw는 근속 주수, workd는 근속일수를 의미.

Comments