我的數據集是這樣的:將函數應用於一組一組的(在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和質量,然後把它們放在一起,但這將是一個麻煩的方法。
如何讓我的功能起作用,或者如何更正確地做到這一點?
答:
最簡單的解決方案,從影子,誰在使用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