[R 쉽게 설명하기] R 프로그래밍 함수, 조건문, 반복문
엘리스는 이상한 나라에서 R 마을에 도착했어요. 마을 주민들은 모두 데이터 마법사처럼 보였죠.
한 마법사가 엘리스에게 다가왔어요. "안녕, 엘리스! 여기서는 R의 수치적 함수에 대해 배울 수 있어. 나와 함께 연습해볼까?"
엘리스는 고개를 끄덕였고, 마법사는 엘리스에게 마법의 책을 건넸어요.
"이 책에는 많은 수치적 함수들이 있단다. 먼저 기본적인 상수와 삼각함수를 살펴보자."
엘리스는 책을 펼쳤어요.
pi
sin(x)
cos(x)
tan(x)
asin(1)
acos(0)
atan(0.6)
"와, 이 함수들은 수학시간에 배운 것들이네요!" 엘리스가 말했어요.
마법사는 미소를 지었죠. "맞아. 이제 로그와 지수 함수를 살펴보자."
x<-3
y<-4
log(x+y)
log10(x+y)
exp(10)
엘리스는 마법사와 함께 연습하며 함수들을 하나씩 이해해 나갔어요.
"루트 함수도 있네요! 그리고 벡터에서 최소값, 최대값, 범위를 구하는 함수도!"
sqrt(8)
x<-c(1,2,-3,4)
min(x)
max(x)
range(x)
마법사는 엘리스에게 pairwise 비교 함수들도 보여줬어요.
x1<-c(1,2,-3,4)
x2<-c(2,4,-6,7)
pmin(x1,x2)
pmax(x1,x2)
"이건 두 벡터를 원소별로 비교하는 거구나!" 엘리스가 깨달았어요.
마지막으로, 마법사는 통계 함수들을 소개했어요.
x1<- c(1,2,3,4,5,6)
mean(x1)
sd(x1)
var(x1)
median(x1)
quantile(x1,0.5)
x<-c(1,2,3,4,5,6,7,8,9,10)
y<-c(10,9,8,7,6,5,4,3,2,5)
cor(x,y)
엘리스는 평균, 표준편차, 분산, 중앙값, 분위수, 상관계수까지 배웠어요.
"정말 놀라워요! R에는 이렇게 많은 함수들이 있었네요. 데이터를 분석하는 데 정말 유용할 것 같아요."
마법사는 엘리스에게 웃으며 말했어요. "너의 열정이 있다면 R로 할 수 있는 일은 무궁무진할 거야. 계속해서 배우고 탐험하길 바라!"
엘리스는 R 마을에서 조건문의 숲으로 향했어요. 숲에는 크고 작은 나무들이 있었는데, 각 나무에는 조건이 적혀있었죠.
"안녕, 엘리스!" 한 목소리가 들려왔어요. 엘리스가 고개를 돌리자, '조건요정'이 웃으며 말했어요. "여기는 조건문의 숲이란다. if와 else의 마법을 배우고 싶니?"
엘리스의 두 눈이 반짝였어요. "네, 배우고 싶어요!"
요정은 엘리스를 첫 번째 나무로 안내했어요. 나무에는 다음과 같은 코드가 쓰여있었어요.
x <- c(1, 2, 3, 4)
y <- c(2, 1, 4, 5)
if (sum(x) < sum(y)) print(x)
"이 조건문은 x의 합이 y의 합보다 작을 때만 x를 출력하란다." 요정이 설명했어요. "if 다음의 괄호 안에 조건을 쓰고, 조건이 참일 때 실행할 명령을 적는 거지."
엘리스는 고개를 끄덕이며 다음 나무로 갔어요. 나무에는 여러 줄의 조건문이 적혀있었어요.
if (sum(x) < sum(y)) {
print(mean(x))
print(var(x))
}
"오, 이건 조건이 참일 때 여러 개의 명령을 실행하는 거네요!" 엘리스가 말했어요. "중괄호 안에 여러 줄의 명령을 쓸 수 있어요."
숲을 계속 탐험하던 엘리스는 'else'라고 적힌 나뭇가지를 발견했어요.
if (mean(x) > mean(y)) {
print("Mean(x) > Mean(y)")
} else {
print("Mean(x) < Mean(y)")
}
요정은 웃으며 말했어요. "if가 있으면 else도 있지. 조건이 거짓일 때 실행되는 거란다. if와 else 사이에는 명령이 들어가고, else 다음에는 조건이 거짓일 때 실행할 명령이 오는 거야."
엘리스는 고개를 끄덕이며 중첩 조건문이 적힌 나무를 발견했어요.
if (length(x) == 5) {
if (sum(x) == 10) {
print("length=5, sum=10")
} else {
print("length=5, but sum is not 10")
}
} else {
if (length(x) == 4 && sum(x) == 10) {
print("length=4, sum=10")
} else {
print("Conditions not met")
}
}
"조건문 안에 또 조건문이 있어요. 마치 러시아 인형 같네요!" 엘리스가 감탄했어요. "조건문은 중첩해서 사용할 수 있어요. 외부 조건문이 참일 때 내부 조건문을 검사하는 식으로요."
요정은 엘리스를 'ifelse'라고 적힌 연못으로 안내했어요.
x <- c(1, 2, 3, 4)
y <- c(2, 1, 4, 5)
ifelse(sum(x - y) > 0, "positive", ifelse(sum(x - y) < 0, "negative", "zero"))
"ifelse는 조건에 따라 다른 값을 반환하는 함수란다. 첫 번째 인자는 조건, 두 번째 인자는 조건이 참일 때 반환할 값, 세 번째 인자는 조건이 거짓일 때 반환할 값이야. 조건을 ifelse 안에 중첩해서 쓸 수도 있지."
엘리스는 연못에 비친 자신의 모습을 보며 미소 지었어요.
마지막으로, 요정은 엘리스에게 'switch'라는 이름의 동굴을 보여줬어요.
x <- c(1, 2, 3, 4)
type <- "var"
result <- switch(type,
mean = mean(x),
median = median(x),
sum = sum(x),
var = var(x))
print(result)
"switch는 표현식의 값에 따라 다른 코드를 실행하는 거란다. 첫 번째 인자는 표현식, 그 다음부터는 표현식의 값에 따라 실행할 코드를 쓰는 거야. 표현식의 값과 일치하는 이름의 코드가 실행되지."
엘리스는 조건문의 숲에서 배운 것들을 되새기며 요정에게 인사했어요.
"정말 감사해요! 조건문의 마법을 배울 수 있어서 정말 기뻐요."
요정은 엘리스를 향해 손을 흔들며 말했어요. "조건문을 잘 활용하면 네 코드는 더 스마트해질 거야. 항상 조건을 현명하게 선택하길 바라!"
엘리스는 조건문의 숲을 떠나 '반복문의 동굴'로 향했어요. 동굴 입구에는 "여기서는 같은 일을 반복하는 마법을 배울 수 있습니다"라고 쓰여 있었죠.
동굴 안으로 들어선 엘리스 앞에 '반복요정'이 나타났어요. "안녕, 엘리스! 여기서는 for, while, repeat 마법을 배울 수 있어요. 준비됐나요?"
엘리스는 고개를 끄덕였고, 반복요정은 첫 번째 마법, 'for'를 시연했어요.
for(i in 1:5) print(rep(i,i))
"for 마법은 정해진 횟수만큼 반복하는 거예요. i라는 변수가 1부터 5까지 변하면서, i를 i번 반복하는 마법을 걸어요!"
엘리스는 감탄했어요. "오, 이걸 활용하면 반복 작업을 훨씬 쉽게 할 수 있겠어요!"
x <- 0
for (i in 1:10) x <- x+i
x
"맞아요! 예를 들어 이 마법은 1부터 10까지의 합을 구할 때 유용하죠."
다음은 'while' 마법이었어요.
i <- 1
x <- 0
while(i <= 10) {
x <- x + i
i <- i + 1
}
x
"while은 조건이 참인 동안 반복하는 마법이에요. 이 마법도 1부터 10까지의 합을 구할 때 쓸 수 있죠."
엘리스는 고개를 끄덕이며 마지막 마법, 'repeat'에 대해 물었어요.
i <- 1
x <- 0
repeat{
if(i > 10) break
x <- x + i
i <- i + 1
}
x
"repeat는 무한히 반복하는 마법이에요. 대신 반복을 멈출 조건을 만들어줘야 해요. 여기서는 i가 10보다 커지면 break 마법으로 반복을 멈추죠."
엘리스는 반복문의 세 마법사를 만나 기뻐했어요. 하지만 반복요정은 한 가지를 더 보여주었어요.
for(i in 1:9) {
if(i > 3) break
for(j in 1:9) {
if(j > 1) break
cat(i, "*", j, "=", i*j, "n")
}
}
"반복 마법 안에 다른 반복 마법을 걸 수도 있어요. 이렇게 하면 구구단처럼 중첩된 반복 작업을 할 수 있죠. 그리고 break나 next로 반복을 제어할 수도 있어요."
엘리스는 반복문의 마법에 푹 빠졌어요. 같은 작업을 반복하는 데에는 정말 유용한 마법이었죠.
"정말 놀라운 마법이에요! 덕분에 반복 작업이 훨씬 쉬워질 것 같아요."
반복요정은 웃으며 말했어요. "반복문의 마법을 잘 활용하면 코드가 더 간결하고 효율적이 될 거예요. 하지만 반복이 무한히 이어지지 않도록 조심해야 해요!"
엘리스는 반복요정의 조언을 마음에 새기며 반복문의 동굴을 나왔어요. 이제 그녀는 R의 반복 마법사가 된 것만 같았죠. 앞으로의 모험이 더욱 기대되는 엘리스였답니다.
실습하기
1. 삼각함수
pi
[1] 3.141593
sin(pi/2)
[1] 1
cos(pi)
[1] -1
tan(pi/4)
[1] 1
asin(1)
[1] 1.570796
acos(0)
[1] 1.570796
atan(0.6)
[1] 0.5404195
2. 로그와 지수 함수
x <- 3
y <- 4
log(x+y)
[1] 1.94591
log10(x+y)
[1] 0.8450980
exp(10)
[1] 22026.47
3. 최소값, 최대값, 범위를 구하는 함수
sqrt(8)
[1] 2.828427
x <- c(1,2,-3,4)
min(x)
[1] -3
max(x)
[1] 4
range(x)
[1] -3 4
4. pairwise 비교 함수
x1 <- c(1,2,-3,4)
x2 <- c(2,4,-6,7)
pmin(x1,x2)
[1] 1 2 -6 4
pmax(x1,x2)
[1] 2 4 -3 7
5. 통계 함수
x1 <- c(1,2,3,4,5,6)
mean(x1)
[1] 3.5
sd(x1)
[1] 1.870829
var(x1)
[1] 3.5
median(x1)
[1] 3.5
quantile(x1,0.5)
50%
3.5
x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(10,9,8,7,6,5,4,3,2,5)
cor(x,y)
[1] -0.7470475
6. if else 조건문
✈️
x <- c(1, 2, 3, 4)
y <- c(2, 1, 4, 5)
if (sum(x) < sum(y)) print(x)
[1] 1 2 3 4
🚁
if (sum(x) < sum(y)) {
print(mean(x))
print(var(x))
}
[1] 2.5
[1] 1.666667
⛴️
if (mean(x) > mean(y)) {
print("Mean(x) > Mean(y)")
} else {
print("Mean(x) < Mean(y)")
}
[1] "Mean(x) < Mean(y)"
7. 중첩조건문
if (length(x) == 5) {
if (sum(x) == 10) {
print("length=5, sum=10")
} else {
print("length=5, but sum is not 10")
}
} else {
if (length(x) == 4 && sum(x) == 10) {
print("length=4, sum=10")
} else {
print("Conditions not met")
}
}
[1] "length=4, sum=10"
8. ifelse
x <- c(1, 2, 3, 4)
y <- c(2, 1, 4, 5)
ifelse(sum(x - y) > 0, "positive", ifelse(sum(x - y) < 0, "negative", "zero"))
[1] "negative"
9. switch
x <- c(1, 2, 3, 4)
type <- "var"
result <- switch(type,
mean = mean(x),
median = median(x),
sum = sum(x),
var = var(x))
print(result)
[1] 1.666667
10. for 반복문
🚆
for(i in 1:5) print(rep(i,i))
[1] 1
[1] 2 2
[1] 3 3 3
[1] 4 4 4 4
[1] 5 5 5 5 5
🚀
x <- 0
for (i in 1:10) x <- x+i
x
[1] 55
11. while 반복문
i <- 1
x <- 0
while(i <= 10) {
x <- x + i
i <- i + 1
}
x
[1] 55
12. repeat
i <- 1
x <- 0
repeat{
if(i > 10) break
x <- x + i
i <- i + 1
}
x
[1] 55
for(i in 1:9) {
if(i > 3) break
for(j in 1:9) {
if(j > 1) break
cat(i, "*", j, "=", i*j, "n")
}
}
1 * 1 = 1
2 * 1 = 2
3 * 1 = 3