私のデータセットは次のようになります。
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でうまく機能します。ただし、データの「品質」の値も含めたいと思います。つまり、1 か月あたりの種の数がバランスがとれている場合、またはたとえば夏の間により多くの種が含まれている場合です。したがって、月ごとの固有種数の年間標準偏差を簡単に計算できると考えました。次のように、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)))