더북(TheBook)

adply()

adply( )는 배열(a)을 받아 데이터 프레임(d)을 반환하는 함수다. 그러나 입력이 반드시 배열일 필요는 없다. 그보다는 주어진 입력을 숫자 색인으로 읽을 수 있는가(즉, 행렬처럼 다룰 수 있는 형태의 데이터인가) 하는 점이 중요하다. 이런 이유로 데이터 프레임도 숫자 색인으로 각 행이나 열을 접근할 수 있어 adply( )를 적용할 수 있다.

표 5-3 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로 모두 일치하므로 리스트를 반환하지 않고 행렬로 결과가 반환된 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.