검색
검색
공개 노트 검색
회원가입로그인

[R 쉽게 설명하기] R 프로그래밍 함수, 조건문, 반복문

reasonofmoon_Depict_a_heartwarming_farewell_as_Ellis_equipped_w_dd36b663-1f6b-456e-bbd4-8ee862b65d97

엘리스는 이상한 나라에서 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로 할 수 있는 일은 무궁무진할 거야. 계속해서 배우고 탐험하길 바라!"

reasonofmoon_Imagine_a_vibrant_illustration_depicting_Ellis_in__99785ead-0732-4896-ace0-de76f35abd4e


엘리스는 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))
}

"오, 이건 조건이 참일 때 여러 개의 명령을 실행하는 거네요!" 엘리스가 말했어요. "중괄호 안에 여러 줄의 명령을 쓸 수 있어요."

reasonofmoon_Craft_an_illustration_of_Ellis_inside_a_luminous_c_47e33372-ca87-4949-8465-440ed9f65f1b

숲을 계속 탐험하던 엘리스는 '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")
  }
}

"조건문 안에 또 조건문이 있어요. 마치 러시아 인형 같네요!" 엘리스가 감탄했어요. "조건문은 중첩해서 사용할 수 있어요. 외부 조건문이 참일 때 내부 조건문을 검사하는 식으로요."

reasonofmoon_Craft_an_illustration_of_Ellis_inside_a_luminous_c_99d7d4a2-f91d-4e9a-b7ea-c941a55da9a4

요정은 엘리스를 '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는 표현식의 값에 따라 다른 코드를 실행하는 거란다. 첫 번째 인자는 표현식, 그 다음부터는 표현식의 값에 따라 실행할 코드를 쓰는 거야. 표현식의 값과 일치하는 이름의 코드가 실행되지."

엘리스는 조건문의 숲에서 배운 것들을 되새기며 요정에게 인사했어요.

"정말 감사해요! 조건문의 마법을 배울 수 있어서 정말 기뻐요."

요정은 엘리스를 향해 손을 흔들며 말했어요. "조건문을 잘 활용하면 네 코드는 더 스마트해질 거야. 항상 조건을 현명하게 선택하길 바라!"

reasonofmoon_Craft_an_illustration_of_Ellis_inside_a_luminous_c_e9a4a81d-84e4-4608-8f09-3073b97b6393

엘리스는 조건문의 숲을 떠나 '반복문의 동굴'로 향했어요. 동굴 입구에는 "여기서는 같은 일을 반복하는 마법을 배울 수 있습니다"라고 쓰여 있었죠.

동굴 안으로 들어선 엘리스 앞에 '반복요정'이 나타났어요. "안녕, 엘리스! 여기서는 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 마법으로 반복을 멈추죠."

reasonofmoon_Depict_a_heartwarming_farewell_as_Ellis_equipped_w_6129a4c2-0969-40c3-a106-a412cb411a0e

엘리스는 반복문의 세 마법사를 만나 기뻐했어요. 하지만 반복요정은 한 가지를 더 보여주었어요.

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의 반복 마법사가 된 것만 같았죠. 앞으로의 모험이 더욱 기대되는 엘리스였답니다.

reasonofmoon_Imagine_a_vibrant_illustration_depicting_Ellis_in__323e52db-e49f-4324-b4a4-a19439f2a064

실습하기

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
조회수 : 257
heart
공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
T
페이지 기반 대답
AI Chat