我是R的新人,这个问题可能非常基本。 我正在使用R来为某些数据拟合伽马分布,这些数据位于"模型集"数据集。
我想创建一个新的数据框,我可以使用循环列出某些观测值的伽玛分布系数。
这就是我所做的:
我创建了一个载体,其中包含我需要系数的观察结果。
Format<- c('10x2', '10x3','10x7', '17x15', '17x7', '20x2', '20x3','25x4','4 column','5 column','7x7','DPS','FP')
然后我创建了另一个需要填充循环的对象(Shape =伽玛分布的形状)。
Shape<- 1:13
然后我用两个对象
创建了data.frameGammaShape<- data.frame(Format, Shape)
最后我想用一个循环来填充列#34; Shape&#34;与价值观。
for (i in GammaShape$Shape) { GammaShape$Shape[i] = coef(fitdistr(modelset$ETTime[which(modelset$Format == GammaShape$Format[i])]/1000))}
但是我收到了这个错误:
Error in Ops.factor(modelset$Format, GammaShape$Format[i]) : level sets of factors are different
尽管水平是相同的。
答案 0 :(得分:0)
好吧,我的推荐是双重的。首先,在创建data.frame时不要使用因素;如果你真的需要它们,你可以考虑事后。所以:
GammaShape <- data.frame(Format, Shape, stringsAsFactors = FALSE)
第二:for循环是修改data.frames的一种非常低效的方法,因为data.frames的存储和修改方式:每次调整一个值时,你实际上都在重新创建data.frame( new)格式并将其分配给旧名称,这对于大对象来说计算成本很高。虽然这是一个非常小的数据框架,但我建议养成尽可能操作单个向量的习惯,并在完成迭代后合并到data.frame 中。 。所以:
Format <- c('10x2', '10x3', '10x7', '17x15', '17x7', '20x2', '20x3',
'25x4', '4 column', '5 column', '7x7', 'DPS', 'FP')
Shape <- numeric(length(Format))
for(i in seq_along(Shape)){
Shape[i] <- coef(fitdistr(modelset$ETTime[which(modelset$Format == Format[i])]/1000))
}
GammaShape <- data.frame(Format, Shape, stringsAsFactors = FALSE)
...然后,如果你想考虑因素,那么,应用as.factor
。请注意,此解决方案根据我的知识工作 - 您的示例并未向我们展示模型集。