1

私のデータセットは次のようになります。

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)))
4

1 に答える 1

1

品質基準をどのように定義するかが明確ではありません。だから私はこれを行う方法。まず、別の関数で品質基準を定義します。関数はベクトルではなく単一の値を返す必要があることに注意してください(使用しているソリューションでは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
于 2014-02-27T10:26:07.733 に答える