강의영상

- (1/4) while, break, ifelse

- (2/4) switch, reapeat, next

- (3/4) 산술연산자, 논리연산자

- (4/4) 비교연산자, 과제설명

조건, 반복, 루프탈출

while

- 예제1

tot = 0 
i = 1 
while(i<=100){
    tot=tot+i 
    i = i+1 
}
tot
[1] 5050

- 예제1의 다른구현(1)

tot=0
for (i in 1:100) tot = tot +i
tot
[1] 5050

- 예제1의 다른구현(2)

tot = 0 
i = 1 
while(TRUE){
    tot = tot+i 
    i=i+1 
    if (i>100) break 
}
tot
[1] 5050

- 예제1의 다른구현(3)

tot = 0 
i = 1 
while(TRUE){
    tot = tot+i 
    if (i>=100) break 
    i=i+1 
}
tot
[1] 5050

- 저는 while을 싫어합니다.

- 어쩔수 없이 써야할때가 있어서 알고있는 것입니다.

break

- 예제1

for (i in 1:10){
    print(i)
    if(i==3) break 
}
[1] 1
[1] 2
[1] 3

- 예제2

for (i in 1:10){
    for (j in 1:10){
        print(c(i,j))
        if(j==3) break 
    }
    if(i==5) break 
}
[1] 1 1
[1] 1 2
[1] 1 3
[1] 2 1
[1] 2 2
[1] 2 3
[1] 3 1
[1] 3 2
[1] 3 3
[1] 4 1
[1] 4 2
[1] 4 3
[1] 5 1
[1] 5 2
[1] 5 3

ifelse

- 예제1

x= -2:2 
x
[1] -2 -1  0  1  2
ifelse(x>0,x,-x)
[1] 2 1 0 1 2

- 예제1의 다른구현

length(x)
[1] 5
y_ = x*0
y_
[1] 0 0 0 0 0
for (i in 1:length(x)){
    if (x[i]>0) y_[i] = x[i] else 
        y_[i] = -x[i] 
}
y_
[1] 2 1 0 1 2

- 예제2

x= -5:5 
x
 [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
y=ifelse(x<0, 0, ifelse(x>2,x,1))
y
 [1] 0 0 0 0 0 1 1 1 3 4 5
plot(x,x)
points(x,y,col=2,pch=16)

- 예제2의 다른구현

x= -5:5 
x
 [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
y=x*0
y
 [1] 0 0 0 0 0 0 0 0 0 0 0
n=length(x)
n
[1] 11
for(i in 1:n){
    if(x[i]<0) y[i]=0 else 
        if (x[i]>2) y[i]=x[i] else 
            y[i]=1 
}
y
 [1] 0 0 0 0 0 1 1 1 3 4 5

- ifelse와 if~else는 성격이 조금 다름

  • ifelse: 조건에 부합하는 새로운 벡터를 생성하는데 특화되어있음
  • if~else: 조건에 따라 코드의 실행흐름을 제어하는 성격의 문법

switch

- 예제1

switch(1, 10,20,30)
[1] 10
switch(2, 10,20,30)
[1] 20
switch(3, 10,20,30)
[1] 30

- 예제2

switch(1, c(1,2,3),20,c(30,40))
[1] 1 2 3
switch(2, c(1,2,3),20,c(30,40))
[1] 20
switch(3, c(1,2,3),20,c(30,40))
[1] 30 40

- 예제3

switch('a1', a1=c(1,2,3),a2=20,a3=c(30,40))
[1] 1 2 3
switch('a2', a1=c(1,2,3),a2=20,a3=c(30,40))
[1] 20
switch('a3', a1=c(1,2,3),a2=20,a3=c(30,40))
[1] 30 40

- 예제4

(예비학습)

x=1:10 
x
 [1]  1  2  3  4  5  6  7  8  9 10
c(
    mean(x),
    mean(x**2),
    mean((x-mean(x))**2)
)
[1]  5.50 38.50  8.25
38.50 - 5.50**2
[1] 8.25

(예제시작)

switch("f1", 
       f1=mean(x),
       f2=mean(x**2),
       f3=mean((x-mean(x))**2)
)
[1] 5.5
switch("f2", 
       f1=mean(x),
       f2=mean(x**2),
       f3=mean((x-mean(x))**2)
)
[1] 38.5
switch("f3", 
       f1=mean(x),
       f2=mean(x**2),
       f3=mean((x-mean(x))**2)
)
[1] 8.25

- 예제5

myfun<-function(x,f){
    switch(f, 
       meann=mean(x),
       sqmeann=mean(x**2),
       varr=mean((x-mean(x))**2)
    )
}
x=1:5
myfun(x,"meann")
myfun(x,"sqmeann")
myfun(x,"varr")
[1] 3
[1] 11
[1] 2

repeat

- 예제1

tot=0 
i=1 
repeat{
    tot=tot+i 
    i=i+1
    if (i>100) break 
}
tot
[1] 5050

- 잘못된 예제1

tot=0 
i=1 
repeat{
    tot=tot+i 
    i=i+1
}

next

- 예제1

for(i in 1:5){
    if(i==3) next else 
        print(i) 
}
[1] 1
[1] 2
[1] 4
[1] 5

break와 비교

for(i in 1:5){
    if(i==3) break else 
        print(i) 
}
[1] 1
[1] 2

- 예제2

i=0
repeat{
    i=i+1
    if (i>5) break 
    if (i==3) next 
    print(i) 
}
[1] 1
[1] 2
[1] 4
[1] 5

요약

- 조건: if, if~else / ifelse, switch

- 반복: for, while, repeat

- 루프탈출: break, next

연산자

산술연산자

- 예제1

5+2
[1] 7
6-2
[1] 4
3*4
[1] 12
6/5
[1] 1.2

- 예제2

2^3
[1] 8
2**3
[1] 8

- 예제3

31%%3
[1] 1
31%/%3
[1] 10

논리연산자

- 예제1

x=c(T,T,F,F,T) 
y=c(TRUE,FALSE,TRUE,FALSE,TRUE)
x
[1]  TRUE  TRUE FALSE FALSE  TRUE
y
[1]  TRUE FALSE  TRUE FALSE  TRUE
print(x)
print(!x)
[1]  TRUE  TRUE FALSE FALSE  TRUE
[1] FALSE FALSE  TRUE  TRUE FALSE
print(y)
print(!y)
[1]  TRUE FALSE  TRUE FALSE  TRUE
[1] FALSE  TRUE FALSE  TRUE FALSE

Note: TRUE, FALSE 로 구성된 열을 잘 다루면 인덱싱에 유리하다.

- 예제2: 예제1의 응용

x=1:30
x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30
x%%3
 [1] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0
x[x%%3==0] # 3의 배수인것만 출력
 [1]  3  6  9 12 15 18 21 24 27 30
x[!(x%%3==0)] # 3의 배수가 아닌것만 출력
 [1]  1  2  4  5  7  8 10 11 13 14 16 17 19 20 22 23 25 26 28 29

- 예제2의 다른구현 (논리연산자와 TRUE/FALSE 로 이루어진 열을 다루는데 익숙하지 않다면 고생스러울 때가 있음)

x<-c() 
j=1 
for (i in 1:30){
    if (i%%3 == 0) {
        x[j]= i 
        j=j+1 
    }
}
x
 [1]  3  6  9 12 15 18 21 24 27 30
x<-c() 
j=1 
for (i in 1:30){
    if (i%%3 != 0) {
        x[j]= i 
        j=j+1 
    }
}
x
 [1]  1  2  4  5  7  8 10 11 13 14 16 17 19 20 22 23 25 26 28 29

- 예제3

x=c(T,T,F,F,T)
y=c(T,F,T,F,T)
print(x)
print(y)
print(x&y) ## and 연산자, 하나라도 FALSE이면 FALSE
[1]  TRUE  TRUE FALSE FALSE  TRUE
[1]  TRUE FALSE  TRUE FALSE  TRUE
[1]  TRUE FALSE FALSE FALSE  TRUE

- 예제4: 예제3의 응용

x=1:50
x[(x>30) & (x%%3==0)] # 30보다크고, 3의 배수인것들
[1] 33 36 39 42 45 48
x[(x>30) & !(x%%3==0)]
 [1] 31 32 34 35 37 38 40 41 43 44 46 47 49 50

- 예제5

x=c(T,T,F,F,T)
y=c(T,F,T,F,T)
print(x)
print(y)
print(x|y) ## or 연산자, 하나라도 TRUE이면 TRUE
[1]  TRUE  TRUE FALSE FALSE  TRUE
[1]  TRUE FALSE  TRUE FALSE  TRUE
[1]  TRUE  TRUE  TRUE FALSE  TRUE

- 예제6: 예제5를 응용

x=1:50 
x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
x>30 | x<10
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[37]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[49]  TRUE  TRUE
x[x>30 | x<10]
 [1]  1  2  3  4  5  6  7  8  9 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
[26] 47 48 49 50

- 예제7

x=c(T,F,T,T,F)
y=c(F,T,F,F,T)
print(x)
print(y)
print(x&&y)
[1]  TRUE FALSE  TRUE  TRUE FALSE
[1] FALSE  TRUE FALSE FALSE  TRUE
[1] FALSE
  • x&&y 와 (x&y)[1]는 거의 같음

- 예제8

x=c(T,F,T,T,F)
y=c(F,T,F,F,T)
print(x)
print(y)
print(x||y)
[1]  TRUE FALSE  TRUE  TRUE FALSE
[1] FALSE  TRUE FALSE FALSE  TRUE
[1] TRUE
  • x||y 와 (x|y)[1]는 거의 같음

비교연산자

- 예제1

x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x==y
[1] FALSE  TRUE  TRUE FALSE FALSE
x!=y
[1]  TRUE FALSE FALSE  TRUE  TRUE
!(x==y)
[1]  TRUE FALSE FALSE  TRUE  TRUE

- 예제1의 잘못된 적용 (1)

x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x=y
x
[1] 2 2 3 2 1

- 예제1의 잘못된 적용 (2)

x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x=!y
x
[1] FALSE FALSE FALSE FALSE FALSE
  • ???? 왜 이런결과가?

(잘못된 결과의 분석)

!y
[1] FALSE FALSE FALSE FALSE FALSE
!c(1,1,0,0)
[1] FALSE FALSE  TRUE  TRUE
!c(2,2,0,0)
[1] FALSE FALSE  TRUE  TRUE

- 예제2

x=c(1,2,3,4,5)
y=c(2,2,3,2,1)
x>y
[1] FALSE FALSE FALSE  TRUE  TRUE
x<y
[1]  TRUE FALSE FALSE FALSE FALSE
x>=y
[1] FALSE  TRUE  TRUE  TRUE  TRUE
x<=y
[1]  TRUE  TRUE  TRUE FALSE FALSE

- 예제2의 잘못된 사용

x=>y
Error in parse(text = x, srcfile = src): <text>:1:3: unexpected '>'
1: x=>
      ^
Traceback:
x=<y
Error in parse(text = x, srcfile = src): <text>:1:3: unexpected '<'
1: x=<
      ^
Traceback:

숙제

x= -100:100/10
x
  [1] -10.0  -9.9  -9.8  -9.7  -9.6  -9.5  -9.4  -9.3  -9.2  -9.1  -9.0  -8.9
 [13]  -8.8  -8.7  -8.6  -8.5  -8.4  -8.3  -8.2  -8.1  -8.0  -7.9  -7.8  -7.7
 [25]  -7.6  -7.5  -7.4  -7.3  -7.2  -7.1  -7.0  -6.9  -6.8  -6.7  -6.6  -6.5
 [37]  -6.4  -6.3  -6.2  -6.1  -6.0  -5.9  -5.8  -5.7  -5.6  -5.5  -5.4  -5.3
 [49]  -5.2  -5.1  -5.0  -4.9  -4.8  -4.7  -4.6  -4.5  -4.4  -4.3  -4.2  -4.1
 [61]  -4.0  -3.9  -3.8  -3.7  -3.6  -3.5  -3.4  -3.3  -3.2  -3.1  -3.0  -2.9
 [73]  -2.8  -2.7  -2.6  -2.5  -2.4  -2.3  -2.2  -2.1  -2.0  -1.9  -1.8  -1.7
 [85]  -1.6  -1.5  -1.4  -1.3  -1.2  -1.1  -1.0  -0.9  -0.8  -0.7  -0.6  -0.5
 [97]  -0.4  -0.3  -0.2  -0.1   0.0   0.1   0.2   0.3   0.4   0.5   0.6   0.7
[109]   0.8   0.9   1.0   1.1   1.2   1.3   1.4   1.5   1.6   1.7   1.8   1.9
[121]   2.0   2.1   2.2   2.3   2.4   2.5   2.6   2.7   2.8   2.9   3.0   3.1
[133]   3.2   3.3   3.4   3.5   3.6   3.7   3.8   3.9   4.0   4.1   4.2   4.3
[145]   4.4   4.5   4.6   4.7   4.8   4.9   5.0   5.1   5.2   5.3   5.4   5.5
[157]   5.6   5.7   5.8   5.9   6.0   6.1   6.2   6.3   6.4   6.5   6.6   6.7
[169]   6.8   6.9   7.0   7.1   7.2   7.3   7.4   7.5   7.6   7.7   7.8   7.9
[181]   8.0   8.1   8.2   8.3   8.4   8.5   8.6   8.7   8.8   8.9   9.0   9.1
[193]   9.2   9.3   9.4   9.5   9.6   9.7   9.8   9.9  10.0

아래와 같은 $y$를 생성하라.

$y=\begin{cases} x & |x|>5 \\ 0 & |x| \leq 2 \\ 5 & o.w. \end{cases}$

힌트: ifelse를 중첩, abs()함수를 이용

ifelse(abs(x)>5,x,ifelse(abs(x)<=2,0,5))
  [1] -10.0  -9.9  -9.8  -9.7  -9.6  -9.5  -9.4  -9.3  -9.2  -9.1  -9.0  -8.9
 [13]  -8.8  -8.7  -8.6  -8.5  -8.4  -8.3  -8.2  -8.1  -8.0  -7.9  -7.8  -7.7
 [25]  -7.6  -7.5  -7.4  -7.3  -7.2  -7.1  -7.0  -6.9  -6.8  -6.7  -6.6  -6.5
 [37]  -6.4  -6.3  -6.2  -6.1  -6.0  -5.9  -5.8  -5.7  -5.6  -5.5  -5.4  -5.3
 [49]  -5.2  -5.1   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0
 [61]   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0
 [73]   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   0.0   0.0   0.0   0.0
 [85]   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
 [97]   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
[109]   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
[121]   0.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0
[133]   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.0
[145]   5.0   5.0   5.0   5.0   5.0   5.0   5.0   5.1   5.2   5.3   5.4   5.5
[157]   5.6   5.7   5.8   5.9   6.0   6.1   6.2   6.3   6.4   6.5   6.6   6.7
[169]   6.8   6.9   7.0   7.1   7.2   7.3   7.4   7.5   7.6   7.7   7.8   7.9
[181]   8.0   8.1   8.2   8.3   8.4   8.5   8.6   8.7   8.8   8.9   9.0   9.1
[193]   9.2   9.3   9.4   9.5   9.6   9.7   9.8   9.9  10.0