sapply()
sapply( )는 lapply( )와 유사하지만 리스트 대신 행렬, 벡터 등의 데이터 타입으로 결과를 반환하는 특징이 있는 함수다.
sapply : 벡터, 리스트, 표현식, 데이터 프레임 등에 함수를 적용하고 그 결과를 벡터 또는 행렬로 반환한다. |
sapply( X, # 벡터, 리스트, 표현식 또는 데이터 프레임 FUN, # 적용할 함수 ..., # 추가 인자. 이 인자들은 FUN에 전달된다. ) 반환 값은 FUN의 결과가 길이 1인 벡터들이면 벡터, 길이가 1보다 큰 벡터들이면 행렬이다. |
예를 들어, 아이리스의 컬럼별로 평균을 구하는 경우를 살펴보자. 다음 코드에서 볼 수 있듯이 lapply( )는 결과를 리스트로 반환하지만, sapply( )는 벡터를 반환한다.
> lapply(iris[, 1:4], mean) $Sepal.Length [1] 5.843333 $Sepal.Width [1] 3.057333 $Petal.Length [1] 3.758 $Petal.Width [1] 1.199333 > sapply(iris[, 1:4], mean) Sepal.Length Sepal.Width Petal.Length Petal.Width 5.843333 3.057333 3.758000 1.199333 > class(sapply(iris[, 1:4], mean)) # "numeric"은 숫자를 저장한 벡터를 의미함 [1] "numeric"
sapply( )에서 반환한 벡터는 as.data.frame( )을 사용해 데이터 프레임으로 변환할 수 있다. 이때 t(x)를 사용해 벡터의 행과 열을 바꿔주지 않으면 기대한 것과 다른 모양의 데이터 프레임을 얻게 된다. 다음은 아이리스의 컬럼별 평균을 sapply( )를 사용해 벡터로 구한 뒤 이를 다시 데이터 프레임으로 변환하는 예다.
> x <- sapply(iris[, 1:4], mean) > as.data.frame(x) x Sepal.Length 5.843333 Sepal.Width 3.057333 Petal.Length 3.758000 Petal.Width 1.199333 > as.data.frame(t(x)) Sepal.Length Sepal.Width Petal.Length Petal.Width 1 5.843333 3.057333 3.758 1.199333
다수의 컬럼을 포함하는 데이터 프레임을 처리하다 보면 종종 각 컬럼의 데이터 타입을 알아내고 싶을 때가 있다. 예를 들면, 어떤 컬럼에 숫자가 저장되어 있는지를 판단하는 경우다. 이때 sapply( )를 유용하게 사용할 수 있다. 다음은 아이리스 데이터에서 각 컬럼의 데이터 타입을 구하는 예다.
> sapply(iris, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"