내 데이터 세트는 다음과 같습니다 : 난 그렇게 달 종의 수준을 제외 (연간 종 그룹당하고 싶은 은 그룹의 그룹 함수를 적용 (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)))
제대로 이해하면'tapply'를 잘못 사용하고있는 것입니다. 'sd (tapply (x $ species, x $ month, function (y) length (unique (y))))'를 시도해보십시오. – shadow