adply()
adply( )는 배열(a)을 받아 데이터 프레임(d)을 반환하는 함수다. 그러나 입력이 반드시 배열일 필요는 없다. 그보다는 주어진 입력을 숫자 색인으로 읽을 수 있는가(즉, 행렬처럼 다룰 수 있는 형태의 데이터인가) 하는 점이 중요하다. 이런 이유로 데이터 프레임도 숫자 색인으로 각 행이나 열을 접근할 수 있어 adply( )를 적용할 수 있다.
plyr::adply : 배열을 분할하고 함수를 적용한 뒤 결과를 데이터 프레임으로 반환한다. |
plyr::adply( .data, # 행렬, 배열, 또는 데이터 프레임 # 함수를 적용할 방향. 1(행 방향), 2(컬럼 방향) 또는 c(1, 2)(행과 컬럼 모두의 방향)을 지정할 수 있다. .margins, .fun=NULL # .margin 방향으로 잘려진 데이터에 적용할 함수 ) 반환 값은 데이터 프레임이다. |
adply( )와 유사한 함수에는 ‘4.4.1 apply( )’ 절에서 살펴본 apply( )가 있다. 그러나 apply( )는 행 방향으로 처리할 때 각 컬럼에 서로 다른 데이터 타입이 섞여 있다면 예상치 못한 타입 변환이 발생할 수 있다. 예를 들어, 다음 코드에서 볼 수 있듯이 apply( )에 숫자형 컬럼만 입력으로 주었을 경우에는 그 값이 제대로 숫자로 넘어오지만, 문자열이 섞이면 데이터가 모두 문자열로 변환된다.
> apply(iris[, 1:4], 1, function(row) { print(row) }) Sepal.Length Sepal.Width Petal.Length Petal.Width 5.1 3.5 1.4 0.2 Sepal.Length Sepal.Width Petal.Length Petal.Width 4.9 3.0 1.4 0.2 ... > apply(iris, 1, function(row) { print(row) }) Sepal.Length Sepal.Width Petal.Length Petal.Width Species "5.1" "3.5" "1.4" "0.2" "setosa" Sepal.Length Sepal.Width Petal.Length Petal.Width Species "4.9" "3.0" "1.4" "0.2" "setosa" ...
이러한 변환이 발생한 이유는 apply( )가 한 가지 타입만 저장할 수 있는 ‘행렬’로 결과를 반환하기 때문이다. 본래 apply( )는 벡터, 행렬, 리스트 중 한 가지 타입으로 결과를 반환할 수 있다. 그리고 결과가 한 행이면 벡터를 반환하고, 여러 행이면 행렬을 반환하며, 각 행마다 컬럼 개수가 다르면 리스트를 반환한다. 위의 예에서는 각 행의 컬럼 개수가 5로 모두 일치하므로 리스트를 반환하지 않고 행렬로 결과가 반환된 것이다.