我用的是函数,它有3个成分,αβ和开关点。我需要调整这三个组件来创建这些参数的多个排列。下面是一些代码来演示一个简单的示例,其中参数已经给出了特定的值
a <- 2 # alpha
b <- 2 # beta
sp <- 50 # Switch Point
set.seed(123)
df <- data.frame(X1 = seq(0,200,by=10), X2 = sample(0:200,21 )) 这是上述参数值的公式。
attach(df)
df$X1_a2_b2_sp50 <- ((X1/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)/(((X1/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)+ b)
> df
X1 X2 X1_a2_b2_sp50
1 0 158 0.00000000
2 10 178 0.01315789
3 20 13 0.05063291
4 30 194 0.10714286
5 40 169 0.17582418
6 50 49 0.25000000
7 60 117 0.32432432
8 70 42 0.39516129
9 80 198 0.46043165
.
etc从新变量中可以看到,它的名称以X1开头,以表示原始变量名,然后它有指示alpha级别的a2,b=2和sp=50的名称相同。我需要创建多个转换,以更改a、b、sp值。下面是每个参数需要更改的值的列表。我还需要对多个变量这样做,对于X2也是这样。
a_list <- c(2 , 3 , 4)
b_list <- c( 2, 5)
sp_list <- c(50, 100, 150, 200)
var_list <- c("X1", "X2")X1的结果是创建24个变量=3 (a) x2 (b) x4 (sp)
# For X1, there should be these variables
df$X1_a2_b2_sp50
df$X1_a2_b2_sp100
df$X1_a2_b2_sp150
df$X1_a2_b2_sp200
df$X1_a2_b5_sp50
df$X1_a2_b5_sp100
df$X1_a2_b5_sp150
df$X1_a2_b5_sp200
df$X1_a3_b2_sp50
df$X1_a3_b2_sp100
df$X1_a3_b2_sp150
df$X1_a3_b2_sp200
df$X1_a3_b5_sp50
df$X1_a3_b5_sp100
df$X1_a3_b5_sp150
df$X1_a3_b5_sp200
df$X1_a4_b2_sp50
df$X1_a4_b2_sp100
df$X1_a4_b2_sp150
df$X1_a4_b2_sp200
df$X1_a4_b5_sp50
df$X1_a4_b5_sp100
df$X1_a4_b5_sp150
df$X1_a4_b5_sp200那么X2也是如此。我要做的方法是使用for循环(对于每个参数),并使用and来创建变量名。我只是想知道是否有更简单的方法来简化这个问题?在R中还能用其他方法吗?如有任何建议,将不胜感激。如果有任何包或方法推荐,我可以调查。在此之前,非常感谢您。
发布于 2020-09-05 00:32:40
你能做的是:
首先,使用tidyr::expand_grid
dplyr使用mutate(across())在所选变量中运行所有这些函数。
我希望这能让你如愿以偿:)
library(tidyr)
library(dplyr)
a_list <- c(2 , 3 , 4)
b_list <- c( 2, 5)
sp_list <- c(50, 100, 150, 200)
var_list <- c("X1", "X2")
param_df <- expand_grid(
a = a_list,
b = b_list,
sp = sp_list
) %>%
mutate(
colname = paste0("a",a,"_b",b,"_sp",sp)
)
my_fun <- function(a, b, sp, ...) {
function(vec){
((vec/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)/(((vec/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)+ b)
}
}
funs_ls <- param_df %>%
pmap(my_fun) %>%
setNames(param_df$colname)
result <- df %>%
mutate(
across(
.cols = all_of(var_list),
funs_ls
)
)发布于 2020-09-05 01:32:11
@亚历克斯,我只是想和大家分享一下我的做法。我也学会了如何创建一个函数,以使这个功能变得更容易。我对像dplr这样的R没有很好的理解,所以它也是一个更简单的方法。
set.seed(123)
df <- data.frame(X1 = seq(0,200,by=10), X2 = sample(0:200,21 ))
a_list <- c(2 , 3 , 4)
b_list <- c( 2, 5)
sp_list <- c(50, 100, 150, 200)
var_list <- c("X1", "X2")
attach(df)
func_dr <- function(x, a, b, sp)
{ ((x/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)/(((x/(((-(-(sp^a)*a-(sp^a)))/(a*b-b))^(1/a)))^a)+ b) }
container <- numeric()
for (i in 1:length(var_list)) {
for (j in 1:length(a_list)) {
for (k in 1:length(b_list)) {
for (l in 1:length(sp_list)) {
result <- func_dr(eval(parse(text = var_list[i])), a_list[j], b_list[k], sp_list[l] )
container <- cbind(container, result)
colnames(container)[ncol(container)] <- paste(var_list[i],
paste("a", a_list[j], sep = ""),
paste("b", b_list[k], sep = ""),
paste("sp", sp_list[l], sep = ""),
sep = "_")
}
}
}
}这可能不是用R写文章的好方法,但我还在学习。谢谢
https://stackoverflow.com/questions/63746676
复制相似问题