如何将函数应用于数据框的行

时间:2019-07-17 20:53:05

标签: r

我希望能够以比仅使用for循环更有效的方式将函数应用于数据帧的每一行,最好使用“ apply”家族函数或类似方法。该函数将根据某些条件(例如哪一行较大以及类似的事情)对行的内容进行一些简单的数学运算。该函数最终将新值放入数据框的空列中,因此将为每一行创建一个新值。我觉得有一个比在整个数据帧中遍历for循环更快的方法,但是我不知道该怎么做。如果我不想从该函数返回任何内容,而只是将其保存的值保存在数据帧/行本身中,我可以这样做吗?我需要哪种函数?

当前,该操作由for循环执行,该循环向下循环数据帧的行。

此外,我已经矢量化了数据帧的所有列,以加快搜索速度,因此下面的for循环实际上并没有遍历该数据帧,而是遍历了包含所有数据的向量。这是必需的还是我使它变得比需要的复杂。

下面的

cntry是向量之一

for(i in 1:length(cntry))
{
     compare some values
     do some simple math
     put a calculated value into row[i] column6
}

在这里编辑更多代码

这是功能:

Reduction <- function()
{
  for(i in 1:length(cntry))
  {
    if(cntry[i] %in% countryvec | oprtr[i] %in% OGCI | cntry[i] %in% 
    flarCountries | oprtr[i] %in% otherOps)
  {
      check <<- check+1
      x <- match(cntry[i],countryvec)
      if(!is.na(x))
      {
        cEnt[i] <<- cRedTarget[x]
        cUncert[i] <<- cRedFinal[x]
      }
      if(oprtr[i] %in% OGCI)
      {
        oEnt[i] <<- .89
        d <- match(oprtr[i], OGCI)
        oUncert[i] <<- OGCIFinal[d]
      }else if(oprtr[i] %in% otherOps)
      {
        y <- match(oprtr[i], otherOps)
        oEnt[i] <- opsTarget[y]
        oUncert[i] <<- opsFinal[y]
      }

  if(orderActions(cntry[i]) < orderActions(oprtr[i]))
  {
    # country gets proirity
    cFinal[i] <<- cUncert[i]
    oFinal[i] <<- ifelse(oUncert[i] - cUncert[i] > 0 , oUncert[i] - 
       cUncert[i], 0)
    rTotal[i] <<- cFinal[i] + oFinal[i]

    maxC <- cntry[i] %in% maxFlarC
    isFlaring <- (eType[i] == "Flaring") & (eSeg[i] == "Upstream")
    allFlared <- sum(baseuncertain[which((cntry == cntry[i])&(eType == 
      "Flaring"))])
    upFlared <- sum(baseuncertain[which((cntry == cntry[i])& (eType == 
      "Flaring") & (eSeg == "Upstream"))])
    vfEmissions <- sum(baseuncertain[which((cntry == cntry[i]) &((eType == 
      "Vented")|(eType == "Fugitive")))])
    if(maxC) # is the country going to max out the flaring efficiency
    {
      if(isFlaring)
      {
        adjEm[i] <<- baseuncertain[i] * .2
        adjFlar[i] <<- .98

      }else
      {
        adjEm[i] <<- baseuncertain[i] * (rTotal[i] * 
      sum(baseuncertain[which(cntry == country)]) - .8 * upFlared) / 
  vfEmissions
      }
    }else
    {

      if(isFlaring)
      {
        adjEm[i] <<- baseuncertain[i] * (rTotal[i] *(allFlared / 
        upFlared))
        adjFlar[i] <<- 1-((1- baseflar[i]) * (1 -rTotal[i]))

      }else
      {
        adjEm[i] <<- baseuncertain[i] * (1 - rTotal[i])
      }
    }

  }else
  {
    # op gets priority
    oFinal[i] <<- oUncert[i]
    cFinal[i] <<- ifelse(cUncert[i] - oUncert[i] >0 , cUncert[i] - 
      oUncert[i], 0)
    rTotal[i] <<- cFinal[i] + oFinal[i]
    adjEm[i]  <<- baseuncertain[i] * (1 - rTotal[i])

  }
}

}

上面的函数中还有一个名为orderActions的附加函数,如下:

orderActions <- function(thing)
{
  tier <- 6
  for(i in 1:5)
  {
    if(thing %in% orderTier[[i]])
    {
      tier <- i
    }
  }
  return(tier)
}

0 个答案:

没有答案