【发布时间】:2020-08-12 16:01:58
【问题描述】:
奇怪的是,我认为从查看 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)
我想自动化我创建的一个函数(如下),以使用来自我的 df 的值的不同组合来计算 vars。
例如w的计算需要使用a和b,而d需要使用c和e这样w = a *q ^ b和d = c * q ^ e。此外,q 是一个分位数,所以我实际上想要w50、w90 等,它们将对应于来自 df 的q50、q90 等。
在我看来,棘手的部分是将条件设置为使用 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 等的新列,它们使用q50、q90 和最初定义的相应系数。
【问题讨论】:
-
您能澄清一下
w = a *q(quantiles) ^ b在数学上的含义吗?因为q()是base::quit。 -
抱歉,不清楚。更新了符号以希望描述。本质上,我想求解多个 q 值的方程,例如
w(q50)和w(q90)等
标签: r for-loop dplyr nested apply