在数据集组内分配Weibull密度

时间:2013-12-10 20:11:22

标签: r dataframe subset probability-density weibull

我正在尝试使用Weibull密度值在data.frame(df)上创建一个新列。

我需要考虑此df中的组,为分位数矢量(w)分配密度 子集由变量“plot”分隔。

每个图都有特定的威布尔参数,其密度应来自 参数存储在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")

我尝试调整hadley的答案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

它返回一个4800行的data.frame(我原本期待1200行)。

我还查看了?ddply帮助页面中提供的示例,但无法弄清楚如何使其适应这种情况。

2 个答案:

答案 0 :(得分: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

也许???

答案 1 :(得分:1)

您获得4个值,因为df_2有4行。您需要告诉R使用df_2的{​​{1}}的第一行w

以下代码生成预期输出:

plot == 1