2013-12-10 10 views
0

내 데이터 프레임 (df)에와 이블 밀도 값을 사용하여 새 열을 작성하려고합니다.데이터 세트 그룹 내에서와 이브 밀도 할당

이 df의 그룹을 고려하여 quantile (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") 

나는 해들리의 대답 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 도움말 페이지에 제공된 예제를 살펴 보았지만이 상황에 적응하는 방법을 알 수 없었다.

답변

1

df_2에는 4 개의 행이 있으므로 4 개의 값을 얻습니다. R에게 plot == 1w 값에 대해 df_2의 첫 번째 행을 사용하도록 알릴 필요가 있습니다.

다음 코드는 예상 출력을 생성 : 물론

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). –