SW/R

R : 반복문 for (개념 및 예제)

얇은생각 2019. 2. 17. 12:30
반응형

반복문 for


for : 예제1

for(i in 1:10) {
print(i)
}
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10


for 반복문의 원리가 느껴지시나요? i가 1부터 10까지 할당되서 print문이 10번 실행됩니다.



for : 예제2

for(i in 1:10) {
cat("2*",i,"=",2*i,"\n")
}
# 2* 1 = 2
# 2* 2 = 4
# 2* 3 = 6
# 2* 4 = 8
# 2* 5 = 10
# 2* 6 = 12
# 2* 7 = 14
# 2* 8 = 16
# 2* 9 = 18
# 2* 10 = 20


for문을 이해하셨다면 위처럼 응용해서 원하는 다양한 값도 도출할 수 있습니다.



for : 예제3

for(i in 1:20) {
if(i%%2==0) { # 짝수인지 확인
print(i)
}
}
# 2
# 4
# 6
# 8
# 10
# 12
# 14
# 16
# 18
# 20


%% 연산을 활용해서 짝수인지 홀수인지 알 수 있습니다. 그 값을 활용해서 짝수만 활용한 연산도 가능합니다.



for : 예제4

v1 <- 101:200

for(i in 1:length(v1)) {
if(v1[i]%%2==0) {
print(v1[i]*2)
} else {
print(v1[i]+2)
}
}
# 103
# 204
# 105
# 208
# 107
# 212
# 109
# 216
# 111
# 220
# 113
# 224...


이번 예제는 벡터의 길이만큼 i를 반복실행합니다. 홀수일때와 짝수일때 연산을 다르게 동작합니다.



for : 예제5

sum <- 0
for(i in 1:100) {
sum <- sum + i
}
print(sum)
# 5050


이번 예제는 i를 100회 실행합니다. 1부터 100까지의 모든 합을 출력하는 예제입니다. 다른 자료의 값들을 활용할때도 자주 사용하는 문법이겠죠?



for : 예제6

while(i <= 10) {
print(i)
i <- i+1
}
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10



for : 예제7

iris 데이터셋에서 Sepal.Length 가 5.0~6.0 사이인 행들만 골라서 Sepal.Length, Sepal.Width 의 값을 구해볼까요?


subset(iris, Sepal.Length >= 5.0 &
Sepal.Length <= 6.0)[,1:2]
# Sepal.Length Sepal.Width
# 1 5.1 3.5
# 5 5.0 3.6
# 6 5.4 3.9
# 8 5.0 3.4
# 11 5.4 3.7


subset 함수를 활용해서 조건을 달아 5.0~6.0 사이의 length가 해당하는 행들만 추출합니다. 또 추출을 하면서 legnth와 width 열만 추출합니다.



idx <- c()
for (i in 1:nrow(iris)){
if (iris[i, "Sepal.Length"] >= 5.0 &
iris[i, "Sepal.Length"] <= 6.0) {
idx <- c(idx, i)
}
}
print(idx)
# 1 5 6 8 11 15 16 17 18 19 20 21 22 24 26 27 28 29 32 33 34
# 36 37 40 41 44 45 47 49 50 54 56 60 61 62 63 65 67 68 70 71 79
# 80 81 82 83 84 85 86 89 90 91 93 94 95 96 97 99 100 102 114 115 120
# 122 139 143 150


위에서 활용한 subset 함수와 동일한 작동을 하는 코드입니다. 어떠신가요? 코드는 조금 길어져도 훨씬 직관적입니다. 기호에 맞게 활용하시면 됩니다.



iris[idx, c("Sepal.Length", "Sepal.Width")]
# Sepal.Length Sepal.Width
# 1 5.1 3.5
# 5 5.0 3.6
# 6 5.4 3.9
# 8 5.0 3.4


추출한 idx의 행값을 컬럼에 연결해줍니다. 동일한 값이 추출되는 것이 보이시죠? 추가적으로 말씀을 드리면, 반복 횟수가 정해진 반복문은 for 를 이용해야 합니다. 달라질 수 있는 반복문에는 보통 while을 사용합니다. 



for : 변수 초기화의 필요성


for(i in 1:100) {
ss <- ss + i # error 발생
}
# Error in ss : object 'ss' not found
print(ss)
# Error in print(ss) : object 'ss' not found
# 이 값이 무엇인지 알 수 없음
# Error: unexpected symbol in "이 값이"
ss <- 0
for(i in 1:100) {
ss <- ss + i # 정상실행
}
print(ss)
# 5050


위쪽 코드는 에러가 나지만 아래쪽 코드는 에러가 나지 않습니다. 그 이유는 ss의 값을 초기화해주었기 때문입니다. 기본적으로 변수에 값을 담아놓지 않는다면 어떤수를 더해야할지 몰라 에러가 납니다. 종종하는 실수이니 유의하셔야 합니다.

반응형