2012-05-02 3 views
2

다음과 비슷한 데이터 프레임이 있습니다. 일부 개인은 특정 변수에 대해 둘 이상의 관찰을 가지며 각 변수에는 추정치와 관련된 표준 오차 (SE)가 있습니다. 각 개인에 대해 하나의 행만 포함하는 새로운 데이터 프레임을 만들고 싶습니다. Kim이나 Bob과 같이 하나 이상의 관찰이있는 개인의 경우, 새로 계산 된 가중 평균에 대한 분산과 함께 추정치의 표준 오차를 기반으로 정밀도 가중 평균을 계산해야합니다. 가중 평균의 분산 될 반복 된 관측으로 행 중에서 정밀도 가중 평균을 생성합니다.

weighted.mean(c(example$var1[2], example$var1[10]), 
    c(1/example$SE1[2], 1/example$SE1[10])) 

와 밥의 새로운 SE1에 대한

는 것으로 예를 들어, 밥을 위해,이 var1, 이것은 내가 새로운 dataframe에서 자신의 VAR1 값이 원하는 것을 의미 : 나는 집계 함수를 사용하여 시도 및 값의 산술 평균을 계산할 수,하지만 내가 쓴 간단한 기능은 표준 오차를 사용하지 않으며이 NAS에 처리 할 수있다

1/sum(1/example$SE1[2] + 1/example$SE1[10]) 

.

aggregate(example[,1:4], by = list(example[,5]), mean) 

이 문제를 해결하기위한 코드를 개발하는 데 도움이 되시길 바랍니다. 다음은 예제 데이터 집합입니다.

set.seed(1562) 
example=data.frame(rnorm(10,8,2)) 
colnames(example)[1]=("var1") 
example$SE1=rnorm(10,2,1) 
example$var2=rnorm(10,8,2) 
example$SE2=rnorm(10,2,1) 
example$id= 
    c ("Kim","Bob","Joe","Sam","Kim","Kim","Joe","Sara","Jeff","Bob") 
example$SE1[5]=NA 
example$var1[5]=NA 
example$SE2[10]=NA 
example$var2[10]=NA 
example 

     var1  SE1  var2  SE2 id 
1 9.777769 2.451406 6.363250 2.2739566 Kim 
2 8.753078 2.174308 6.219770 1.4978380 Bob 
3 7.977356 2.107739 6.835998 2.1647437 Joe 
4 11.113048 2.713242 11.091650 1.7018666 Sam 
5   NA  NA 11.769884 -0.1310218 Kim 
6 5.271308 1.831475 6.818854 3.0294338 Kim 
7 7.770062 2.094850 6.387607 0.2272348 Joe 
8 9.837612 1.956486 8.517445 3.5126378 Sara 
9 4.637518 2.516896 7.173460 2.0292454 Jeff 
10 9.004425 1.592312  NA   NA Bob 

답변

3

나는 이런 종류의 문제에 대해 plyr 패키지를 좋아합니다. 기능적으로는 aggregate과 같아야하지만 사용하기 편리하고 편리하다고 생각합니다. website에는 많은 예제와 plyr에 대한 훌륭한 ~ 20 페이지 소개가 있습니다. 데이터가 data.frame로 시작하고 다른 쪽 끝에서 다른 data.frame을 원하기 때문에이 문제에 대한, 우리는 반환 ddply()

library(plyr) 
#f1() 
ddply(example, "id", summarize, 
     newMean = weighted.mean(x=var1, 1/SE1, na.rm = TRUE), 
     newSE = 1/sum(1/SE1, na.rm = TRUE) 
    ) 

사용

또한
id newmean newSE 
1 Bob 8.8982 0.91917 
2 Jeff 4.6375 2.51690 
3 Joe 7.8734 1.05064 
4 Kim 7.1984 1.04829 
5 Sam 11.1130 2.71324 
6 Sara 9.8376 1.95649 

?summarize을 확인하고 ? 다른 좋은 배경으로는 transform입니다. 더 복잡한 작업을 위해 필요하다면 익명의 함수를 plyr 함수에 전달할 수도 있습니다.

또는 일부 작업에 대한 빠른 증명할 수 data.table 패키지 사용 : 빨리 내 간단한 노트북에이 데이터 집합에 대한

library(rbenchmark) 
#f1 = plyr, #f2 = data.table 
benchmark(f1(), f2(), 
      replications = 1000, 
      order = "elapsed", 
      columns = c("test", "elapsed", "relative")) 

     test elapsed relative 
    2 f2() 3.580 1.0000 
    1 f1() 6.398 1.7872 

그래서 data.table()입니다 ~ 1.8 :

library(data.table) 
dt <- data.table(example, key="id") 
#f2() 
dt[, list(newMean = weighted.mean(var1, 1/SE1, na.rm = TRUE), 
      newSE = 1/sum(1/SE1, na.rm = TRUE)), 
    by = "id"] 

빠른 벤치 마크.

+0

고마워요. 매우 유용한 답변. – msis