연산과 함수(Operations and Functions)
연산(Operations)과 함수(Functions)
숫자(numeric
)
산술연산(Arithmetic operations)
3 + 2
5 - 4
3 * 2
72 / 2
3 ^ 4
3 ** 4
3 ^ (1/2)
sqrt(3)
3 - 2 + 2 * 4 / 2 ^ (1 + 1)
# PEMDAS(Parenthesize , Exponentiate , Multiply , Divide, Add, Subtract)
7 / 3 # Float division
7 %/% 3 # Integer division
7 %% 3 # Remainder
- 사칙연산(
+
,-
,*
,/
)과 제곱(^
,**
)은 가장 기본적인 연산이다. 이들이 한 식 안에 존재할 경우 연산 순서는 PEMDAS로 정해진다. 괄호, 제곱, 곱셈과 나눗셈, 더하기와 빼기 순이다.- Parenthesize(괄호)
- Exponentiate(제곱)
- Multiply/Divide(승제)
- Add/Substract(가감)
함수
exp(1)
## [1] 2.718282
log(180, base=2)
## [1] 7.491853
log2(180)
## [1] 7.491853
log10(180)
## [1] 2.255273
sin(2)
## [1] 0.9092974
- 위의 코드는 대표적인 초월함수를 R에서 구한 것이다.
log2(180)
= \(\log_2 180\)log10(180)
= \(\log_{10} 180\)
연산
"+"(3,2)
## [1] 5
"*"(3,2)
## [1] 6
"%p%" = function(x,y) { 2^x + y^2 }
3 %p% 2
## [1] 12
"%p%"(3,2)
## [1] 12
- 뒤에서 살펴보겠지만 R에서 모든 이항 연산은 본질적으로 함수이다. 다음을 한 번 실행시켜보자.
"+" = function(x, y) x*y
3+2
## [1] 6
3+3
## [1] 9
"+"
## [1] "+"
- 덧셈이 곱셈이 되었다! 원상회복하려면
rm("+")
.
비교 연산
7 < 3
## [1] FALSE
7 > 3
## [1] TRUE
7 == 3
## [1] FALSE
7 != 3
## [1] TRUE
sqrt(2)^2 == 2
## [1] FALSE
print(sqrt(2)^2)
## [1] 2
print(sqrt(2)^2, digits = 21)
## [1] 2.0000000000000004
all.equal(sqrt(2)^2, 2)
## [1] TRUE
all.equal(1e-23, 1e-24)
## [1] TRUE
- R에서 대소와 같음을 확인하는 연산은
<
,>
,==
이다. 컴퓨터의 연산과 수 표현은 정확성에 한계가 있다.all.equal
은 이런 한계를 고려하여 완전히 동일하지 않아도 충분히 비슷하다면TRUE
를 반환한다.dplyr
패키지의near
함수도 비슷한 역할을 한다.
dplyr::near(1e-23, 1e-24)
## [1] TRUE
near <- dplyr::near
near(1e-23, 1e-24)
## [1] TRUE
문자(character
)
print("Letter")
## [1] "Letter"
print('Letter')
## [1] "Letter"
print('"Hello", says he')
## [1] "\"Hello\", says he"
cat('"Hello", says he')
## "Hello", says he
print('Cheer up!\r\nRight Now!')
## [1] "Cheer up!\r\nRight Now!"
cat('Cheer up!\r\nRight Now!')
## Cheer up! ## Right Now!
#https://stat.ethz.ch/R-manual/R-devel/library/base/html/Quotes.html
nchar('hello?') # number of characters
## [1] 6
paste('Here is', 'an apple.')
## [1] "Here is an apple."
substring('hello?', 2, 3) # from 2nd character to 3rd character
## [1] "el"
- 앞에서 봤듯이
print
와cat
는 문자열을 화면에 표시할 때 쓰인다. nchar
은 문자열의 문자 수를 보여준다.paste
는 두 문자열을 연결할 때 쓰인다.substring
은 문자열의 일부분을 얻을 때 쓰인다.
날짜/시간(Date
/POSIxct
)
Sys.Date() # 현재 날짜
## [1] "2019-03-13"
Sys.time() # 현재 날짜와 시간(POSIXct 형식)
## [1] "2019-03-13 11:19:07 KST"
as.Date("2018/12/31") # 문자열 "2018/12/31"을 날짜 형식으로
## [1] "2018-12-31"
as.POSIXct("2018/12/31 23:59:59")
## [1] "2018-12-31 23:59:59 KST"
# 문자열 "2018/12/31 23:59:59"을 날짜시간 형식으로
Sys.Date() - as.Date("2019-01-01") # 2018년 1월 1일과 현재 날짜의 차이
## Time difference of 71 days
as.POSIXct("2019/12/31 23:59:59")-Sys.time()
## Time difference of 293.5284 days
# 현재 날짜 시간과 2019년 12월 31일 23시 59분 59초의 차이
difftime(as.POSIXct("2018/12/31 23:59:59"), Sys.time())
## Time difference of -71.47163 days
# 현재 날짜 시간과 2018년 12월 31일 23시 59분 59초와의 차이
difftime(as.POSIXct("2018/12/31 23:59:59"), Sys.time(), units='mins')
## Time difference of -102919.1 mins
# 현재 날짜 시간과 2018년 12월 31일 23시 59분 59초와의 차이(분 단위로)
difftime(as.POSIXct("2018/12/31 23:59:59"), Sys.time(), units='secs')
## Time difference of -6175149 secs
# 현재 날짜 시간과 2018년 12월 31일 23시 59분 59초와의 차이(초 단위로)
# units은 다음 중 하나: 'auto', 'secs', 'mins', 'hours', 'days', 'weeks'
as.numeric(as.POSIXct("2018/12/31 23:59:59"))-as.numeric(Sys.time())
## [1] -6175149
# POSIXct는 초단위로 저장된다.
(as.numeric(as.POSIXct("2018/12/31 23:59:59"))-as.numeric(Sys.time()))/60
## [1] -102919.1
# 초를 60으로 나누면 분 단위가 된다.
Sys.Date()
은 현재 날짜,Sys.time()
은 현재 시간을 보여준다.Sys.Date()
의D
는 대문자이고,Sys.time()
의t
는 소문자임을 유의하자.as.Date()
와as.POSIXct
는 날짜 또는 날찌-시간을 나타내는 문자열을 날짜, 날짜-시간 형식의 R 데이터로 변환한다.- 문자열과 날짜 형식의 데이터를 비교해보자. 예를 들어 문자열
'2020-01-01'
과'2019-12-31'
을 생각해보자. 첫번째 문자열에서 두번째 문자열을 빼서 하루를 얻을 수 없다. 왜냐하면 문자열에서는-
연산이 정의되어 있지 않기 때문이다. - 반면 날짜는
2020-01-01
에서2019-12-31
을 뺄 수 있다.
- 문자열과 날짜 형식의 데이터를 비교해보자. 예를 들어 문자열
- 날짜 또는 날짜-시간 데이터에 관해 자세한 내용은 ???장에서 다뤄진다.
'2020-01-01'-'2019-12-31'
## Error in "2020-01-01" - "2019-12-31": non-numeric argument to binary operator
as.Date('2020-01-01')-as.Date('2019-12-31')
## Time difference of 1 days
논리(logical
)
(7 < 3) & (4 > 3)
## [1] FALSE
(7 < 3) | (4 > 3)
## [1] TRUE
!(7 < 3)
## [1] TRUE
xor(T, T) # XOR
## [1] FALSE
x = NA
isTRUE(x == 3) # robust to NAs
## [1] FALSE
- R에서 논리값은
TRUE
,FALSE
,T
,F
으로 나타낼 수 있다. 이때TRUE
는 항상 ‘참’을 나타낸다. R에서TRUE
는 ‘참’을 나타내는 예약어(keyword)로 다른 의미가 부여될 수 없다. 반면T
와F
는 R에서TRUE
와FALSE
로 미리 값을 부여하였지만 변경될 수 있다. 다음의 코드를 통해 확인해 보자. 따라서 참/거짓을TRUE
/FALSE
로 쓰면 혹시라도T
/F
의 값이 변할 때에도 정상적으로 프로그램이 작동한다.
TRUE <- c(3,2)
## Error in TRUE <- c(3, 2): invalid (do_set) left-hand side to assignment
T <- c(3,2)
T
## [1] 3 2
T <- TRUE
참고자료> https://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html
정리
데이터 타입 | 연산과 함수 |
---|---|
숫자(numeric ) |
^ (** ), * , / , + , - , < , == , > , exp() , log() , … |
문자(character ) |
nchar() , paste() , substring() |
날짜(Date ) |
Sys.Date() , - , difftime() |
날짜시간(POSIXct ) |
Sys.time() , - , difftime() |
논리(logical ) |
& , ! , xor() , && , |
Leave a comment