Странно для этого, я думаю, что легче начать с просмотра df.
#reproducible data
quantiles<-c("50","90")
var=c("w","d")
df=data.frame(a=runif(20,0.01,.5),b=runif(20,0.02,.5),c=runif(20,0.03,.5),e=runif(20,0.04,.5),
q50=runif(20,1,5),q90=runif(20,10,50))
head(df)
Я хочу автоматизировать созданную мной функцию (ниже) для вычисления vars
, используя различные комбинации значений из моего df. Например, для вычисления w
необходимо использовать a
и b
, а для d
необходимо использовать c
и e
, чтобы w = a *q ^ b
и d = c * q ^ e
. Далее, q
- это квантиль, поэтому я на самом деле хочу w50
, w90
, et c., Что будет соответствовать q50
, q90
et c. от дф.
Сложная часть, как я вижу, это установка условия для использования a & b против c & d без использования вложенных циклов. У меня есть функция для вычисления vars
с использованием соответствующих столбцов, однако я не могу эффективно собрать все части вместе.
#function to calculate the w, d
calc_wd <- function(df,col_name,col1,col2,col3){
#Calculate and create new column col_name for each combo of var and quantile, e.g. "w_50", "d_50", etc.
df[[col_name]] <- df[[col1]] * (df[[col2]] ^ (df[[col3]]))
df
}
Я могу заставить это работать для одного случая, но не автоматизируя поменять коэффициент ... вы увидите, я задаю "a" и "b" ниже.
wd<-c("w_","d_")
make_wd_list<-apply(expand.grid(wd, quantiles), 1, paste,collapse="")
calc_wdv(df,make_wd_list[1],"a",paste0("q",sapply(strsplit(make_wd_list[1],"_"),tail,1)),"b")
В качестве альтернативы, я попытался сделать эту работу, используя вложенные циклы for, но, похоже, не могу добавить данные правильно. И это уродливо.
var=c("w","d")
dataf<-data.frame()
for(j in unique(var)){
if(j=="w"){
coeff1="a"
coeff2="b"
}else if(j=="d"){
coeff1="c"
coeff1="e"
}
print(coeff1)
print(coeff2)
for(k in unique(quantiles)){
dataf<-calc_wd(df,paste0(j,k),coeff1,paste0("q",k),coeff2)
dataf[k,j]=rbind(df,dataf) #this aint right. tried to do.call outside, etc.
}
}
В конце я ищу новые столбцы с w_50
, w_90
, et c., Которые используют q50
, q90
и соответствующие коэффициенты, как определено изначально.