将dlply函数的结果附加到原始表

时间:2013-08-06 16:31:05

标签: r plyr subset

这个问题建立在Simon和James提供here

的答案之上

dlply函数很好地在我的数据子集中给出了Y估计值。现在,我的挑战是将这些Y估计值和残差重新计入原始数据框,以计算拟合度统计数据和进一步分析。

我能够使用cbinddlply输出列表转换为行向量,但结果并不是很好(对于糟糕的降价感到抱歉)。

model <- function(df){ glm(Y~D+O+A+log(M), family=poisson(link="log"), data=df)}
Modrpt <- ddply(msadata, "Dmsa", function(x)coef(model(x)))
Modest <- cbind(dlply(msadata, "Dmsa", function(x) fitted.values(model(x))))

Subset name | Y_Estimates
-------------------------
Dmsa 1      | c(4353.234, 234.34,...
Dmsa 2      | c(998.234, 2543.55,...

这并不能真正回复邮件,因为我需要将{Y}个数据框的Y_estimates列中的单个Y估计值(由逗号分隔)加到我的Modest数据框中。 / p>

理想情况下,我知道这是不正确的,但我会在这里举一个例子,我想做这样的事情:

msadata

如果我可以将列表分解为单个Y估计值,我可以通过msadata$Y_est <- cbind(dlply(msadata, "Dmsa", function(x)fitted.values(model(x)))) 将其加入msadata数据框。我觉得这与迈克尔的答案here非常相似,但在采用迈克尔的"Dmsa"join()建议之前,需要一些内容来区分列表元素。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在上一个问题中,我提出了一个data.table解决方案。我认为它更适合您想要做的事情,因为您希望按组应用模型,然后将结果与原始数据汇总。

library(data.table)
DT <- as.data.table(df)
models <- DT[,{
                mod= glm(Y~D+O+A+log(M), family=poisson(link="log"))
                data.frame(res= mod$residuals,
                           fit=mod$fitted.values,
                           mod$model)
               },                          
                by = Dmsa]

这是一个带有一些数据的应用程序:

## create some data
set.seed(1)
d.AD <- data.frame(
counts = sample(c(10:30),18,rep=TRUE),
outcome = gl(3,1,18),
treatment = gl(3,6),
type = sample(c(1,2),18,rep=TRUE) ) ## type is the grouping variable
## corece data to a data.table        
library(data.table)
DT <- as.data.table(d.AD)
## apply models
DT[,{mod= glm(formula = counts ~ outcome + treatment, 
                              family = poisson())
               data.frame(res= mod$residuals,
                          fit=mod$fitted.values,
               mod$model)},                          
                     by = type]

   type           res      fit counts outcome treatment
 1:    1 -3.550408e-01 23.25729     15       1         1
 2:    1  2.469211e-01 23.25729     29       1         1
 3:    1  9.866698e-02 25.48543     28       3         1
 4:    1  5.994295e-01 18.13147     29       1         2
 5:    1  4.633974e-16 23.00000     23       2         2
 6:    1  1.576093e-01 19.86853     23       3         2
 7:    1 -3.933199e-01 18.13147     11       1         2
 8:    1 -3.456991e-01 19.86853     13       3         2
 9:    1  6.141856e-02 22.61125     24       1         3
10:    1  4.933908e-02 24.77750     26       3         3
11:    1 -1.154845e-01 22.61125     20       1         3
12:    2  9.229985e-02 15.56349     17       1         1
13:    2  5.805515e-03 21.87302     22       2         1
14:    2 -1.004589e-01 15.56349     14       1         1
15:    2  2.537653e-16 14.00000     14       1         2
16:    2 -1.603110e-01 21.43651     18       1         3
17:    2  1.662347e-01 21.43651     25       1         3
18:    2 -4.214963e-03 30.12698     30       2         3