繁体   English   中英

如何将来自不同向量的多个分布函数调用到 R 中的 function

[英]How to call multiple distribution functions from different vectors into a function in R

让我们谈谈我的工作流程:

大概的概念

根据 dataframe、select 中的数据,适当的分布函数,以所有可能的方式组合它们以获得组合分布的平均值。

启动 position

  • 我有一个大数据框df 在此示例中,我有不同的变量var1var2var3 ,其中包含 select 的数据,适当的分布 function。
  • 每个变量我有几个分布函数:
var1_distr1 <- pdqr::as_d(function(x)dnorm(x, mean = 3, sd = 1))
var1_distr2 <- pdqr::as_d(function(x)dnorm(x, mean = 6, sd = 1))
var1_distr3 <- pdqr::as_d(function(x)dnorm(x, mean = 2, sd = 2))

var2_distr1 <- pdqr::as_d(function(x)dnorm(x, mean = 5, sd = 3))
var2_distr2 <- pdqr::as_d(function(x)dnorm(x, mean = 3, sd = 1))
var2_distr3 <- pdqr::as_d(function(x)dnorm(x, mean = 4, sd = 2))

var3_distr1 <- pdqr::as_d(function(x)dnorm(x, mean = 4, sd = 1))
var3_distr2 <- pdqr::as_d(function(x)dnorm(x, mean = 5, sd = 1))
var3_distr3 <- pdqr::as_d(function(x)dnorm(x, mean = 7, sd = 2))

Select 权利分布

在每个var上使用if_else我在新向量中生成每个案例的适当分布。 var1if_else看起来像这样,并且对于所有var具有相同的外观:

df$distr_var1 <- if_else(df$info < 0, "var1_distr1",
                         if_else(df$info > 0 & df$info < 100, "var1_distr2", "var1_distr3")

这导致以下df

df <- data.frame(distr_var1 = c("var1_distr1", "var1_distr3", "var1_distr1", "var1_distr2", "var1_distr2", "var1_distr1", "var1_distr3"),
                 distr_var2 = c("var2_distr2", "var2_distr1", "var2_distr2", "var2_distr1", "var2_distr3", "var2_distr3", "var2_distr1"),
                 distr_var3 = c("var3_distr2", "var3_distr3", "var3_distr1", "var3_distr1", "var3_distr2", "var3_distr3", "var3_distr1"))

组合分布函数

为了在新的比例分布 function 中结合分布函数,我根据这个问题创建了这个 function:

foo <- function(...){
  #set x values
  x <- seq(1, 10, by = 1)
  #create y values
  y <- 1L
  for (fun in list(...)) y <- y * fun(x)
  #create new PDF
  p <- data.frame(x,y)
  pdqr::new_d(p, type = "continuous")
}

我已将 PDF 存储在一个列表中:

PDFS <- list(var1_distr1 = var1_distr1, var1_distr2 = var1_distr2, var1_distr3 = var1_distr3,
             var2_distr1 = var2_distr1, var2_distr2 = var2_distr2, var2_distr3 = var2_distr3,
             var3_distr1 = var3_distr1, var3_distr2 = var3_distr2, var3_distr3 = var3_distr3)

我想在df中使用 function foodf中给出的所有分布组合生成比例分布。 因此,对于每种情况,以下组合: var1_var2var1_var3var2_var3var1_var2_var3

计算分布的均值

如果我想单独计算分布的平均值,我可以这样做:

means <- sapply(PDFS, pdqr::summ_mean)
df$mean_var1 <- means[df$distr_var1]

或者:

df$mean_var2 <- sapply(mget(df$distr_var2), pdqr::summ_mean)

两种方法都可以正常工作。 但是在组合var1_var2var1_var3var2_var3var1_var2_var3我还没有找到合适的方法,但尝试了这些:

df$var1_var2_mean <- sapply(foo(mget(mapply(PDFS, sapply, df$distr_var1, df$distr_var2))), pdqr::summ_mean)

我试图通过使用列表来克服不调用函数的问题,但事情似乎变得太复杂/嵌套而无法很好地工作......

问题

如何 select 在distr_var1distr_var2distr_var3中给出适当的分布,使用foo将它们组合并使用pdqr::summ_mean计算平均值?

我对所有评论感到满意,也对一般的工作流程感到满意

foreach循环对我有用:

df$var1_var2_mean <- foreach(i = 1:nrow(df), .combine = c) %do% {
  A <- as.name(df$var1[i])
  B <- as.name(df$var2[i])
  mean <- summ_mean(foo(get(A),get(B)))
}

而且,对于每种组合,我都需要这样做。 至少我得到了它的工作...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM