2014-02-27 2 views
1

내 데이터 세트는 다음과 같습니다 : 난 그렇게 달 종의 수준을 제외 (연간 종 그룹당하고 싶은 은 그룹의 그룹 함수를 적용 (ddply에서 tapply)

d = data.frame(year=rep(2000:2002,each=40),month=rep(c(rep(1:12,3),5,6,7,8),3),species=rep(c(rep(letters[1:12],3),"a","b","g","l"),3),species_group=NA,kg=round(rnorm(120,15,6),digits=2)) 
d$species_group=ifelse(d$species %in% letters[1:5],"A","B") 

) 포함 된 종의 평균 무게와 수. 이것은 ddply와 잘 동작합니다. 그러나 나는 또한 나의 데이터의 "품질"의 가치를 포함하고 싶다. 즉, 한 달에 종의 수가 균형을 이루거나 여름철에 더 많은 수종이 포함 된 경우입니다. 그러므로 나는 한 달에 고유 종의 수의 연간 표준 편차를 계산할 수있을 것이라고 생각했습니다. 나는 다음과 ddply로 tapply와 함께이 일을 시도 :

s=ddply(d,c("year","species_group"),function(x) cbind(n_species=length(unique(x$species)), 
                quality=tapply(x,x$month,sd(length(unique(x$species)))), 
                kg=sum(x$kg,na.rm=T))) 

를하지만 나에게 이런 걸 내가 얻을 싶습니다 어떤 오류

Error in match.fun(FUN) : 'sd(length(unique(x$species)))' is not a function, character or symbol 

입니다 제공 :

output=data.frame(year=rep(2000:2002,each=2),species_group=rep(c("A","B"),3),n_species=rep(c(7,9),3),quality=round(rnorm(6,2,0.3),digits=2),kg=round(rnorm(6,15,6),digits=2)) 

을 월, 연도 및 종 그룹별로 처음으로 ddply를 사용할 수는 없습니다. 이는 일년에 고유 종의 수를 더 이상 알 수 없기 때문입니다. 나는 n_species와 quality를 따로 계산해서 나중에 합칠 수 있다고 생각하지만, 이것은 성가신 접근법이 될 것입니다.

어떻게 기능을 작동시킬 수 있습니까? 아니면 어떻게하면 더 적절하게 할 수 있습니까?

답변 :

가장 쉬운 해결책은 tapply의 사용에 내 실수를 지적 그림자에서왔다. 표준 편차보다 표준 오차가 더 적합해야하며 다음 공식을 사용하십시오.

s=ddply(d,c("year","species_group"),function(x) cbind(n_species=length(unique(x$species)), 
                quality=sd(tapply(x$species,x$month, function(y) length(unique(y))))/sqrt(length(tapply(x$species,x$month, function(y) length(unique(y))))), 
                kg=sum(x$kg,na.rm=T))) 
+1

제대로 이해하면'tapply'를 잘못 사용하고있는 것입니다. 'sd (tapply (x $ species, x $ month, function (y) length (unique (y))))'를 시도해보십시오. – shadow

답변

1

품질 기준을 어떻게 정의 하시겠습니까? 이렇게 나는 어떻게 이것을 할 것입니다. 먼저 품질 기준을 별도의 기능으로 정의합니다. 함수가 벡터가 아닌 단일 값을 retuen해야 함을 유의하십시오 (솔루션에서 벡터를 반환하는 tapply을 사용하고 있음).

## returns the mean of sd variation per month 
get_quality <- 
    function(species,month) 
    mean(tapply(species,month, 
       FUN=function(s)sd(as.integer(s))), 
    na.rm=TRUE) 

그런 다음 ddply 내에서 사용합니다. 코드를 단순화하기 위해 그룹별로 적용 할 함수도 작성했습니다.

ff <- 
function(x) { 
    cbind(n_species=length(unique(x$species)), 
     quality= get_quality(x$species,x$month), 
     kg=sum(x$kg,na.rm=TRUE)) 
} 
library(plyr) 

s=ddply(d,.(year,species_group),ff) 


    year species_group n_species quality  kg 
1 2000    A   5 0.4000000 259.68 
2 2000    B   7 0.2857143 318.24 
3 2001    A   5 0.4000000 285.07 
4 2001    B   7 0.2857143 351.54 
5 2002    A   5 0.4000000 272.46 
6 2002    B   7 0.2857143 331.45 
관련 문제