apply 함수의 반환값 정리

apply함수는 for문이나 repeat문 보다 속도가 빠르다. 다량의 데이터를 처리할 때에는 apply함수를 사용하도록 추천한다.

기본적으로 apply함수는 vector/matrix/list 3가지 형태의 반환값을 가진다. 반환값 특징에 따라 형식이 결정된다.
1. vector 리턴
기본적으로 apply 실행 함수에서 1개의 값을 반환하면 반환값이 vector를 갖는다. 숫자형인 경우 numeric vector, 문자인 경우는 character vector를 반환한다. x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) dimnames(x)[[1]] <- letters[1:8] class(x) # [1] "matrix" rt.vector <- apply(x, 2, function(x, trim) { # 1개의 숫자가 반환 return (mean(x, trim = trim)) }, trim = .2) is.vector(rt.vector) # TRUE # rt.vector # x1 x2 # 3 3 # => 벡터가 리턴됨
2. matrix 리턴
return 문에서 vector가 반환하면 matrix 가 반환된다. 숫자형 vector인 경우 numeric matrix, 문자형 vector인 경우는 character형 matrix 를 반환한다. x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) dimnames(x)[[1]] <- letters[1:8] class(x) # [1] "matrix" # # integer matrix가 반환되는 예제 # rt.mtx.1 <- apply(x, 2, function(x) { smpl <- sample(1:26, size = 2, replace = F) # 2개의 숫자가 반환 return (smpl) }) class(rt.mtx.1) # "matrix" typeof(rt.mtx.1) # "integer" # # character matrix가 반환되는 예제 # rt.mtx.2 <- apply(x, 2, function(x) { smpl <- sample(1:26, size = 2, replace = F) # 2개의 문자가 반환 return (LETTERS[smpl]) }) class(rt.mtx.2) # "matrix" typeof(rt.mtx.2) # "character" rt.mtx.2 # x1 x2 # [1,] "O" "T" # [2,] "P" "X" # # character matrix가 반환되는 예제 2 # 문자와 숫자가 혼합된 경우 character matrix 가 반환됨 rt.mtx.3 <- apply(x, 2, function(x) { smpl <- sample(1:26, size = 2, replace = F) # 1개의 숫자 2개의 문자가 반환 return (c(mean(x), LETTERS[smpl])) }) class(rt.mtx.3) # "matrix" typeof(rt.mtx.3) # "character" rt.mtx.3 # x1 x2 # [1,] "3" "3" # [2,] "S" "S" # [3,] "O" "X"
3. list 리턴
아래는 결과가 list로 반환되는 예제이다. 더불어 반환값을 data.frame으로 반환받기 위한 테스트이기도 하다.
결과값을 data.frame에 저장하는 방식은
  • 전역 변수에 반환 받을 data.frame을 정의한 후 apply 함수에서 전역 변수에 정의된 data.frame에 입력시키거나
  • 반환된 list 객체를 data.frame에 저장하는 방식을 취할 수 있다.
위에서 첫번째 방식은 메모리 접근이 실행 블록을 벗어나는 이유로 속도가 느려진다. x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) dimnames(x)[[1]] <- letters[1:8] class(x) # [1] "matrix" # # list가 반환되는 예제 rt.lst.1 <- apply(x, 2, function(x) { smpl <- sample(1:26, size = 2, replace = F) df <- as.data.frame(t(LETTERS[smpl]), stringsAsFactors = F) df <- cbind(df, x.mean = mean(x)) # 1개의 숫자 2개의 문자 컬럼을 가지는 데이터 프레임 반환 return (df) # return (df[1,]) }) class(rt.lst.1) # "list" typeof(rt.lst.1) # "list" rt.lst.1 # $`x1` # V1 V2 x.mean # 1 I P 3 # # $x2 # V1 V2 x.mean # 1 P X 3 # list를 data.frame으로 변환 rt.df <- do.call(rbind.data.frame, rt.lst.1) rt.df # V1 V2 x.mean # x1 X U 3 # x2 H F 3

댓글 없음:

댓글 쓰기