2016-07-21 5 views
1

같은 변수와 길이의 목록이 1000 개 포함 된 큰 목록이 있습니다.큰 목록에서 변수의 표준 편차를 계산하려면 R

제 목표는 큰 목록 내의 모든 목록의 평균, 표준 편차 및 표준 오류를 계산하는 것입니다.

저는 Reduce()을 사용하여 변수의 평균을 계산했습니다. 그러나 표준 편차에 대해서도 같은 방법으로 계산할 수 없었습니다.

내 목록이 같은 같습니다

large.list <- vector('list', 1000) 

for (i in 1:1000) { 
    large.list[[i]] <- as.data.frame(matrix(c(1:4), ncol=2)) 
} 

large.list 

[[1]] 
    V1 V2 
1 1 3 
2 2 4 

[[2]] 
    V1 V2 
1 1 3 
2 2 4 

[[3]] 
    V1 V2 
1 1 3 
2 2 4 

...... 

[[1000]] 
    V1 V2 
1 1 3 
2 2 4  

하는 평균 계산하기를, 내가 할 :

list.mean <- Reduce("+", large.list)/length(large.list) 

list.mean 

    V1 V2 
1 1 3 
2 2 4 

이것은 큰 목록의 지나치게 단순화 된 버전입니다,하지만 난 목록 전체 방법을 계산할 수 있습니다 표준 편차와 표준 오류는 평균을 위해 한 것처럼?

미리 감사드립니다. 당신이 Reduce() 함께있을 경우

+0

이 질문 [R 동일한 차원 데이터 테이블의리스트로부터, 각 셀의 수단의 요약을 생성]의 중복 가능성이다 (HTTP : //stackoverflow.com/q/38475103/3817004). – Uwe

+0

정보를 제공해 주셔서 감사합니다.이미 제안 된 게시물에서 mtoto의 답변과 동일한 전체 목록 평균을 계산할 수있는 솔루션이있었습니다. 내 주요 문제는 아래에 해결 된 게시물 목록 SD를 계산하는 것이 었습니다. 다시 한 번 감사드립니다! – dictdic

답변

0

, 당신은 약간의 통계를해야 할 : 이미 list.mean으로 E(x)있어

var(x) = E(x^2) - (E(x))^2 

참고. 그런 변화는

list.squared.mean <- Reduce("+", lapply(large.list, "^", 2))/length(large.list) 

: E(x^2)를 얻으려면, 그것은 또한 간단한다

list.variance <- list.squared.mean - list.mean^2 

표준 편차는 그러나 단지

list.sd <- sqrt(list.variance) 

, 훨씬 더 효율적인 솔루션이 tapply()을 사용하는 것입니다

vec <- unlist(large.list, use.names = FALSE) 
DIM <- dim(large.list[[1]]) 
n <- length(large.list) 

list.mean <- tapply(vec, rep(1:prod(DIM),times = n), mean) 
attr(list.mean, "dim") <- DIM 
list.mean <- as.data.frame(list.mean) 

list.sd <- tapply(vec, rep(1:prod(DIM),times = n), sd) 
attr(list.sd, "dim") <- DIM 
list.sd <- as.data.frame(list.sd) 
+0

대단히 감사합니다! 두 번째 솔루션은 실제로 훨씬 더 효율적이었습니다. 한 가지 단점은 행 이름과 열 이름이 제거된다는 것입니다. 이 문제를 해결하기 위해 rownames 및 colnames 함수를 추가했습니다. 다시 한 번 감사드립니다! – dictdic

0

대안을 제안 할 수 있다면 목록을 3 차원 행렬로 변환 한 다음 apply()을 사용하여 출력을 생성 할 수 있습니다.

여기 (차원의 규칙 성을 가정)에서 변환하는 방법 :

m <- do.call(cbind,lapply(large.list,as.matrix)); 
m <- array(m,c(nrow(m),ncol(m)/length(large.list),length(large.list))); 

및 여기 행렬 apply()을 사용하는 방법 : 여기

apply(m,1:2,mean); 
##  [,1] [,2] 
## [1,] 1 3 
## [2,] 2 4 
apply(m,1:2,sd); 
##  [,1] [,2] 
## [1,] 0 0 
## [2,] 0 0 
0

데이터로리스트를 재 형성에 기초한 솔루션 .표. 기본적으로 각 하위 목록에서 색인 i의 값을 추출하여 단일 벡터를 만듭니다.

ll <- unlist(large.list) 
DX <- data.table(V1= ll[c(T,F,F,F)], 
       V2= ll[c(F,T,F,F)], 
       V3= ll[c(F,F,T,F)], 
       V4= ll[c(F,F,F,T)]) 

은 모든 계산이 직진 위치 :

mm <- DX[,lapply(.SD,mean)] 
sdd <- DX[,lapply(.SD,sd)] 
관련 문제