2013-12-10 57 views
0

我正嘗試在我的data.frame(df)上創建一個具有Weibull密度值的新列。在數據集組內分配威布爾密度

我需要爲分位數(w)的向量考慮df中的組分配密度。
子集由變量「plot」分隔。

每個小區都有特定的Weibull參數,其中密度應該來源於其中。
參數存儲在df_2中。

重複的例子:

set.seed(25) 

w = rweibull(1200,10,28) 
plot = data.frame(c(rep.int(1,300),rep.int(2,300),rep.int(3,300),rep.int(4,300))) 
    names(plot)[1] = c("plot") 

df = cbind(plot,w) 

df_2=data.frame(cbind(c(1,2,3,4),c(28,27,26,25),c(9,9.5,8,7))) 
    names(df_2)[1:3] = c("plot","scale","shape") 

我試着去適應從哈德利的答案here代碼,但沒有成功。

library(plyr) 
weibull_density <- ddply(df, "plot", function(x) { 
    data.frame(
    density = dweibull(df$w, scale=df_2$scale, shape=df_2$shape) 
) 
}) 

nrow(weibull_density) 
[1] 4800 

它返回一個data.frame與4800行(我期待1200)。

我還看了?ddply幫助頁面中提供的示例,但無法弄清楚如何使其適應這種情況。

回答

1

您獲得4個值,因爲df_2有4行。您需要告知R以使用df_2的第一行作爲plot == 1w值。

下面的代碼生成預期的輸出:

weibull_density <- transform(df, 
    density = as.vector(sapply(unique(plot), function(x) 
    dweibull(w[plot %in% x], scale = df_2$scale[x], shape = df_2$shape[x])))) 
2

我認爲這可能是最簡單的?

> df3=merge(df, df_2) 
> res=mapply(dweibull, x=df3$w, shape=df3$shape, scale=df3$scale) 

> head(res) 
[1] 0.11900795 0.09575625 0.09021534 0.04742028 0.08339647 0.01091331 

> length(res) 
[1] 1200 

也許???

+0

當然還有更多的開銷..但這個例子很清楚的概念...嗯... –

+0

這工作太!感謝這個答案(+1)。 –