R이 함수 언어임에도 불구하고, for문을 지원한다. for문을 쓰는 것보다 apply를 쓰는 게 좋다.
(list와 data frame으로 연결되는 복합 객체의 경우에는 for loop가 잘 동작되지 않는 경우가 많기도 하지만 함수 언어로서의 기능이 워낙 많아서..)
# for loop
sum_data<-0
for(i in 1:5) {
sum_data <- sum_data + i
}
sum_data
결과
[1] 15
x <-0
for(i in 3:3) {
x <-origin_data[i]
}
x
결과
z
1 7
2 8
3 9
apply는 열 단위로 계산한다. 중간의 숫자 1은 열이고, 2는 행을 의미한다. 따라서 data frame에서 열,행 별로 계산을 가능하게 한다.
origin_data <- data.frame(x=c(1,2,3), y=c(4,5,6), z=c(7,8,9))
# apply-열 단위로 계산
test_data <- origin_data
apply(origin_data, 1, sum)
# 열 단위의 계산 값을 마지막 행에 추가
test_data$sum <- apply(origin_data, 1, sum)
test_data
결과
[1] 12 15 18
# apply-행 단위로 계산
test_data <- origin_data
apply(origin_data, 2, sum)
결과
x y z sum
1 1 4 7 12
2 2 5 8 15
3 3 6 9 18
data frame의 4번째 열에 모든 행을 계산한 값을 추가할 수 있다.
# 모든 행의 합을 마지막열에 추가.
test_data[4,] <- apply(origin_data, 2, sum)
test_data
결과
x y z
1 1 4 7
2 2 5 8
3 3 6 9
4 6 15 24
lapply는 list에 적합한 함수로서 list의 element를 순회하고, 함수를 실행한다.
# lapply - data frame 순회한다.
test_data <- origin_data
# data frame의 열을 기준으로 순회
lapply(test_data, sum)
결과
$x
[1] 6
$y
[1] 15
$z
[1] 24
# lapply - 리스트 항목 순회하고 리스트 항목마다 값을 만든다.
list_data <- list(a = 1:5, b = 6:10)
list_data
lapply(list_data, sum)
결과
$a
[1] 1 2 3 4 5
$b
[1] 6 7 8 9 10
함수를 직접 정의해서 추가할 수도 있다.
lapply(list_data, function(x) {
if (is.integer(x)) sum(x)
})
결과
$a
[1] 15
$b
[1] 40
# sapply - 리스트를 순회하고 matrix 리스트를 리턴한다.lapply보다 더 보기 편하고 matrix로 관 할수 있다.
list_data <- list(a = 1:5, b = 6:10)
sapply(list_data, sum)
typeof(list_data)
결과
a b
15 40
[1] "list"
#mapply - 리스트의 열 단위로 복사
list_data1 <- list(a = 1:5, b = 6:10)
mapply(sum, list_data1$a, list_data1$b)
결과
[1] 7 9 11 13 15
• lapply(): list를 순회하고 각 엘리먼트에 함수를 적용한다.
• sapply(): lappy와 같지만, 결과를 간단히 한다.
• apply(): 배열에 함수를 적용한다.
• tapply(): 벡터의 하위 집합에 함수를 적용한다.
• mapply(): lapply의 다변수 버전이다.
'R' 카테고리의 다른 글
단순 선형 회귀 공식 공부 - summary(lm) (0) | 2015.12.16 |
---|---|
[R] data frame에서 조건을 주고 정보 얻기 (0) | 2015.12.10 |
[R] if ~ else와 ifelse 사용법 (0) | 2015.11.25 |
[R] _로 시작하는 변수 선언시 주의 사항 (0) | 2015.11.25 |
data table에서 특정 조건의 데이터 제외하기(또는 포함하기) (0) | 2015.11.24 |