더북(TheBook)

반면 adply( )를 사용해 결과를 데이터 프레임을 변환하면 결과 타입이 문자열로 모두 바뀌는 현상을 피할 수 있다. 다음은 adply( )를 사용해 데이터 프레임의 각 행을 보면서 Sepal.Length가 5.0 이상이고 Species가 setosa인지 여부를 확인한 다음 그 결과를 새로운 컬럼 V1에 기록하는 예다.

> adply(iris,
+       1,
+       function(row) { row$Sepal.Length >= 5.0 &
+                       row$Species == "setosa" })
   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species    V1
1           5.1         3.5          1.4         0.2    setosa  TRUE
2           4.9         3.0          1.4         0.2    setosa FALSE
3           4.7         3.2          1.3         0.2    setosa FALSE
4           4.6         3.1          1.5         0.2    setosa FALSE
5           5.0         3.6          1.4         0.2    setosa  TRUE
...

위 예에서는 adply( )에 인자로 넘긴 함수의 반환 값이 단순한 boolean 값이고, 그 결과가 임의의 컬럼명 V1에 저장되었다. 그러나 최종 반환 값이 데이터 프레임인 경우 함수의 반환 값을 데이터 프레임으로 하는 것이 안전하며, 데이터 프레임을 반환할 경우 계산 값을 저장한 컬럼명을 적절히 지정할 수 있다. 다음은 앞서와 같은 계산을 수행하지만 함수 내부에서 데이터 프레임을 반환하는 예다.

> adply(iris,
+       1,
+       function(row) {
+           data.frame(
+                sepal_ge_5_setosa=c(row$Sepal.Length >= 5.0 &
+                    row$Species == "setosa"))})

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species sepal_ge_5_setosa
1           5.1         3.5          1.4         0.2  setosa              TRUE
2           4.9         3.0          1.4         0.2  setosa             FALSE
3           4.7         3.2          1.3         0.2  setosa             FALSE
4           4.6         3.1          1.5         0.2  setosa             FALSE
5           5.0         3.6          1.4         0.2  setosa              TRUE
6           5.4         3.9          1.7         0.4  setosa              TRUE
...
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.