R에서의 반복문은 for, while 이외에도 repeat, apply, aggregate 등이 있다.
이 중 apply, aggregate 등은, 사용하기는 쉽지만 수행속도가 느린 for 를 보완하기 위한 반복문이다.
for
# for(변수 in 반복횟수) 실행문 : 실행문을 반복 횟수만큼 실행
# 변수 i가 1에서 5까지의 값을 갖을 때까지 print(rep(i, i))라는 실행문을 실행한다.
# i = 1 이면 print(rep(1, 1))을 실행하고, i = 2 이면 print(rep(2, 2))를 실행한다. i = 5 까지 반복 수행한다.
> for(i in 1:5)
+ print(rep(i, i))
# 1부터 10까지 합 구하기
> sum.x <- 0
> for(i in 1:10)
+ sum.x <- sum.x + i
> sum.x
# 중첩 반복문 : 반복문 안에 반복문이 있는 구문
# 구구단 만들기
> gugu <- matrix(0, ncol = 9, nrow = 9)
> for(i in 1:9) {
+ for(j in 1:9) {
+ gugu[i, j] <- i * j
+ }
+ }
> gugu
while
# while(조건) 실행문 : 조건이 참일 때까지 실행문을 수행
# a의 값이 5이하 까지 반복적으로 진행
> a <- 1
> while(a <= 5) {
+ print(rep(a, a))
+ a <- a + 1
+ }
# 1부터 10까지 합 구하기
> a <- 1
> sum.a <- 0
> while(a <= 10) {
+ sum.a <- sum.a + a
+ a <- a + 1
+ }
> sum.a
repeat
repeat문은 실행문을 계속 수행하다 실행문에서 break문을 만나서 반복수행을 멈춘다. break 조건을 잘못 설정하면 박복문이 무한루프에 빠질 수 있으니 주의해야 한다.
# repeat 실행문 : break를 만날때까지 반복 수행
> a <- 1
> repeat {
+ if(a > 5) break # a의 값이 5보다 큰 경우 break 실행
+ print(rep(a, a))
+ a <- a + 1
+ }
# 1부터 10까지 합 구하기
> a <- 1
> sum.a <- 0
> repeat {
+ if(a > 10) break # a의 값이 10보다 큰 경우 break 실행
+ sum.a <- sum.a + a
+ a <- a + 1
+ }
>sum.a
apply
apply 함수는 apply, sapply, lapply 등 다양한 함수가 존재하는데 원하는 결과에 맞춰 사용하면 된다. for문 보다 속도가 빠르고, 많이 사용하는 함수이다.
# apply
> height <- c(140, 155, 142, 175)
> size.1 <- matrix(c(130, 26, 110, 24, 118, 25, 112, 25),
+ ncol = 2, byrow = T, dimnames = list(c("Abe", "Bob", "Carol", "Deb"), c("Weight", "Waist")))
> size <- cbind(size.1, height) # size.1 행렬과 height 벡터의 열 기준 결합
> colmean <- apply(size, 2, mean) # 2 : 열의 평균값을 계산
> rowmean <- apply(size, 1, mean) # 1 : 행의 평균값을 계산
> colvar <- apply(size, 2, var) # 2 : 열의 분산값을 계산
> rowvar <- apply(size, 1, var) # 1 : 행의 분산값을 계산
# sapply
# 결과값이 테이블 형태로 나타난다.
> x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE, FALSE, FALSE, TRUE))
> sapply(x, quantile)
# lapply
# 결과값이 리스트 형태로 나타난다.
> lapply(x, quantile)
aggregate
apply 함수와 동일한 결과를 내보내며, 속도면에서 빠르다는 장점이 있다.
간단한 통계량을 계산할때 많이 사용된다.
# aggregate(x, by, FUN, ..., simplify = TRUE)
> head(iris)
> aggregate(iris$Sepal.Length, by = list(iris$Species), summary)
# 조건에 y = list(iris$Species)로 할 경우 걸럼 명이 Group.1으로 강제 할당 된다.
# 컬럼명을 정의하고 싶으면 다음과 같이 작성한다.
> aggregate(iris$Sepal.Length, by = list(Species = iris$Species), summary)
'해보記 > R' 카테고리의 다른 글
<記> R 스타일 가이드 (0) | 2019.12.30 |
---|---|
<記> R 위치 측도와 산포 측도 (0) | 2019.12.23 |
<記> R 데이터 조건문 - if/ifelse, switch (0) | 2019.12.18 |
<記> R 함수 - 기타 (1) | 2019.12.17 |
<記> R 함수 - 문자형 (0) | 2019.12.17 |