【问题标题】:R: function that returns a result for each row of a data.frameR:为data.frame的每一行返回结果的函数
【发布时间】:2016-05-09 19:08:15
【问题描述】:

您好,我是 R 的初学者,我正在尝试编写一个用于敏感性分析的函数,该函数从样本“X”(一个包含 12 列和每个 2500 个观察值的数据表)返回一个包含 2500 个值的向量,称为 Global成本(每行一个)。它确实可以正常工作,但问题是应该为每一行重新计算的 j1、j2 和 j3(对于 while 循环)用第一个“行”修复 > 变量,因此只有第一个结果实际上是正确的。

lcc<-function(X){
#initial costs
globalcost<-(X[,3]+X[,4]+X[,5]);       
#replacement costs 1
j1<-X[,6];
while(j1<30){globalcost<-globalcost+((X[,3]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j1)));j1<-j1+j1};        
#replacement costs 2
j2<-X[,7];
while(j2<=30){globalcost<-globalcost+((X[,4]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j2)));j2<-j2+j2};       
#replacement costs 3
j3<-X[,8];
while(j3<=30){globalcost<-globalcost+((X[,5]*((1/(1+((X[,2]-X[,1])/(1+X[,1]))))^j3)));j3<-j3+j3};       
#energy costs
globalcost<-globalcost+((5375.81*0.0507*X[,12])*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));        
#maintenance costs 1
globalcost<-globalcost+(X[,9]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));         
#maintenance costs 1
globalcost<-globalcost+(X[,10]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));        
#maintenance costs 3
globalcost<-globalcost+(X[,11]*((1-(1+((X[,2]-X[,1])/(1+X[,1])))^-30)/((X[,2]-X[,1])/(1+X[,1]))));     
#result
return(globalcost)}

我试图创建一个这样的“for循环”

lcc<-function(X){
for (i in 1:2500){
    #initial costs
    globalcost<-(X[i,3]+X[i,4]+X[i,5]);
    #replacement costs 1
    j1<-X[i,6];
    while(j1<30){globalcost<-globalcost+((X[i,3]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j1)));j1<-j1+j1};
    #replacement costs 2
    j2<-X[i,7];
    while(j2<=30){globalcost<-globalcost+((X[i,4]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j2)));j2<-j2+j2};
    #replacement costs 3
    j3<-X[i,8];
    while(j3<=30){globalcost<-globalcost+((X[i,5]*((1/(1+((X[i,2]-X[i,1])/(1+X[i,1]))))^j3)));j3<-j3+j3};
    #energy costs
    globalcost<-globalcost+((5375.81*0.0507*X[i,12])*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
    #maintenance costs 1
    globalcost<-globalcost+(X[i,9]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
    #maintenance costs 1
    globalcost<-globalcost+(X[i,10]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));
    #maintenance costs 3
    globalcost<-globalcost+(X[i,11]*((1-(1+((X[i,2]-X[i,1])/(1+X[i,1])))^-30)/((X[i,2]-X[i,1])/(1+X[i,1]))));}
    #risultato
return(globalcost)}

但在这种情况下,函数返回“globalcost”仅针对最后一行

然后我必须把这个函数放在sobolx &lt;- sobol(model = lcc, X1 = X1, X2 = X2, order = 2, nboot = 100)中以获得敏感性分析

谢谢你..!

【问题讨论】:

  • 您到底想用while(j1&lt;30) 实现什么?您只想将条件应用于值低于30j1?因为这不是你在这里实现的目标。
  • 如果数字 (j1=X[,6]) 小于 30 则应进行替换计算,并像这样重复: CALC^ j1 + CALC^ j1+j1 + CALC^ j1+j1+j1 如果 j1>30 则中断
  • 啊,是的,我正在阅读第一个脚本,但它没有实现这一点(因为你提供了一个完整的向量),但它应该适用于第二个脚本。

标签: r function loops while-loop dataframe


【解决方案1】:

我部分解决了添加问题

  • gc&lt;-c()“for 循环”之前
  • gc[i]&lt;-c(globalcost)循环内
  • return(gc) 在“for 循环”之后

但是现在当我将我的函数作为模型进行敏感性分析时:x &lt;- sobol(model = lcc, X1 = X1, X2 = X2, order = 2, nboot = 100) 我得到了这个错误:

Error in colSums(d[, -1] * d[, 1]) : 
  'x' must be an array of at least two dimensions

【讨论】:

  • 解决了在for (i in 1:nrow(X))中输入nrow(X)
猜你喜欢
  • 2011-12-28
  • 2013-01-05
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2018-06-19
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多