首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多参数函数生成变量(具有参数值的排列)

使用多参数函数生成变量(具有参数值的排列)
EN

Stack Overflow用户
提问于 2020-09-04 18:57:08
回答 2查看 68关注 0票数 1

我用的是函数,它有3个成分,αβ和开关点。我需要调整这三个组件来创建这些参数的多个排列。下面是一些代码来演示一个简单的示例,其中参数已经给出了特定的值

代码语言:javascript
复制
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 )) 

这是上述参数值的公式。

代码语言:javascript
复制
    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也是这样。

代码语言:javascript
复制
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)

代码语言:javascript
复制
# 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中还能用其他方法吗?如有任何建议,将不胜感激。如果有任何包或方法推荐,我可以调查。在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-05 00:32:40

你能做的是:

首先,使用tidyr::expand_grid

  • construct构建一个数据框架,包含a_list、b_list和sp_list的所有可能组合,这是来自df

  • 的参数化函数调用的命名列表,有dplyr使用mutate(across())

在所选变量中运行所有这些函数。

我希望这能让你如愿以偿:)

代码语言:javascript
复制
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
    )
  )
票数 1
EN

Stack Overflow用户

发布于 2020-09-05 01:32:11

@亚历克斯,我只是想和大家分享一下我的做法。我也学会了如何创建一个函数,以使这个功能变得更容易。我对像dplr这样的R没有很好的理解,所以它也是一个更简单的方法。

代码语言:javascript
复制
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写文章的好方法,但我还在学习。谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63746676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档