2013-09-22 3 views
2

"R 덤프"형식으로 데이터를 출력하는 시스템을 사용하고 있습니다.3 차원 배열의 한계 요약

obs <- structure(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24), 
      .Dim=c(2,4,3)) 

내가 R에 새로운 해요하지만이 데이터의 한계 요약을 검사하는 R을 사용하고 싶습니다 예를 들어이 출력 세 가지 차원 배열은 다음과 같이 찾고 있습니다. 예를 들어, 평균값의 2x4 테이블을 그 세 번째 차원에서 평균화하고 싶습니다.

(가능하다면, 나는 또한, 한계 요약 한 차원 아래 붕괴보고 싶습니다 예를 들어 4 평균값의 행이 각각 내 데이터의 2 × 3 조각을 점령하고 의미.)

내가 시도 summary(obs)은 모든 치수를 축소하고 전체 통계를 제공하며 sapply(obs, summary)은 치수를 축소하지 않고 각 데이터의 "요약"을 제공합니다.

나는 내가 뭘했는지에 대한 기능이있을 것이라고 기대하지만 찾을 수가 없다! 이것에 대한

답변

3

apply 작품 :

apply(obs,1:2,mean) 
    [,1] [,2] [,3] [,4] 
[1,] 9 11 13 15 
[2,] 10 12 14 16 

또는

aperm(apply(obs,1:2,summary),c(1,3,2)) 

(또는 apply(obs,2:1,summary) 등의 의견에서 지적) 결과

:

 [,1] [,2] [,3] [,4] 
Min.  1 3 5 7 
1st Qu. 5 7 9 11 
Median  9 11 13 15 
Mean  9 11 13 15 
3rd Qu. 13 15 17 19 
Max.  17 19 21 23 

, , 2 

     [,1] [,2] [,3] [,4] 
Min.  2 4 6 8 
1st Qu. 6 8 10 12 
Median 10 12 14 16 
Mean  10 12 14 16 
3rd Qu. 14 16 18 20 
Max.  18 20 22 24 

은 R 도구 상자에서 파고 동안

+1

+1. 'apply (obs, 2 : 1, summary)'는 당신의'aperm' 예제와 같은 일을한다고 생각합니다. 또한, 작은 오타가 있고,',, 1'이 – Frank

3

, 당신은 또한 plyr 도구를 확인하실 수 있습니다 : a*ply : S는 다른 한계 요약

apply(obs,2,mean) 
## [1] 9.5 11.5 13.5 15.5 

(mean(obs[,1,]) 참으로 9.5입니다 ... 더블 체크를) 얻을 수 있습니다 요청 . 이 함수는 array을 입력으로 사용하며 결과가 반환되는 양식 (배열, 데이터 프레임 또는 목록)을 제어하기 쉽습니다.

예제 배열로 놀 때 치수를 좀 더 쉽게 추적 할 수 있도록 임의의 치수 이름을 추가했습니다. 첫 번째 차원 (행) = 종; 두 번째 (열) = 시간; 세 번째 (별도 '테이블') = 사이트

obs <- array(c(1:24), 
     dim = c(2, 4, 3), 
     dimnames = list(species = c("cat", "dog"), 
         time = 1:4, 
         site = letters[1:3])) 

library(plyr) 
# result as (2-d) array: aaply 
# i.e. same output as @Ben Bolker's `apply` example 
# keep the first two dimensions (species, time), collapse the third (site) 
aaply(obs, 1:2, mean) 

#   time 
# species 1 2 3 4 
#  cat 9 11 13 15 
#  dog 10 12 14 16 

# result as data frame: adply 
adply(obs, 1:2, mean) 

# species time V1 
# 1  cat 1 9 
# 2  dog 1 10 
# 3  cat 2 11 
# 4  dog 2 12 
# 5  cat 3 13 
# 6  dog 3 14 
# 7  cat 4 15 
# 8  dog 4 16 

# several functions 
adply(obs, 1:2, each(min, mean, max)) 
# species time min mean max 
# 1  cat 1 1 9 17 
# 2  dog 1 2 10 18 
# 3  cat 2 3 11 19 
# 4  dog 2 4 12 20 
# 5  cat 3 5 13 21 
# 6  dog 3 6 14 22 
# 7  cat 4 7 15 23 
# 8  dog 4 8 16 24 

# apparently the `each` thing can be used on just one function as well, 
# then the function name appears as column name instead of 'V1' as above. 
adply(obs, 1:2, each(mean)) 
# species time mean 
# 1  cat 1 9 
# 2  dog 1 10 
# 3  cat 2 11 
# 4  dog 2 12 
# 5  cat 3 13 
# 6  dog 3 14 
# 7  cat 4 15 
# 8  dog 4 16 

# one-dimensional summary  
adply(obs, 2, each(mean)) 
# time mean 
# 1 1 9.5 
# 2 2 11.5 
# 3 3 13.5 
# 4 4 15.5 
+0

+1입니다. 나는 plyr를 모른다 : 그 * ply 호출을 작성할 때 차원 이름 (숫자 대신)을 사용할 수 있습니까? – Frank

+2

나는 그렇게 생각하지 않는다. 그러나 당신은 일치 할 수 있었다. (종, dimnames (x))'(틀림없이 약간 clunky) –

+0

@ 프랭크, 나는 벤이 옳다고 생각한다. '? adply'의'.margins' 인자에 대해서 : 아래 첨자에 데이터를 나누는 벡터. 1은 행별로 나누고, 2는 열을, c (1,2)는 행과 열을 사용하여 더 높은 차원을 나타냅니다. 벤이 'match'해결책을 주셔서 감사합니다! – Henrik