我希望能够以比仅使用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)
}