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



lapply는 결과값이 리스트라서 좀 불편할 수 있다. sapply가 심플한 버전이다. 

# 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의 다변수 버전이다. 



Posted by '김용환'
,