【问题标题】:Replacing nested for loop that generates figures with apply family用应用族替换生成图形的嵌套 for 循环
【发布时间】:2020-04-27 08:08:13
【问题描述】:

背景

我有一个来自调查的定量数据集。我想为我拥有的值绘制拟合三角分布(最小值lb,最大值ub,和模式ml)。请注意,我使用的是rtriang(),因为我的数据不包含可以拟合密度函数的分位数。至少这是我的理解。

问题

  • 我现在正在使用一个丑陋的嵌套 for 循环,使用 apply 系列函数执行此操作可能更有效,尽管我不知道如何执行此操作。我该怎么做?

代码

library(data.table)
library(ggplot2)
library(mc2d)

scenarios <- c("s1", "s2")
questions <- c("q1", "q2")
respondents <- c("1","2","3")

data_long <- data.frame(id=c("1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3"),
                         variable=c("s1_q1_ml", "s1_q1_ml", "s1_q1_ml",
                                      "s1_q1_lb", "s1_q1_lb", "s1_q1_lb",
                                      "s1_q1_ub", "s1_q1_ub", "s1_q1_ub",
                                      "s1_q2_ml", "s1_q2_ml", "s1_q2_ml",
                                      "s1_q2_lb", "s1_q2_lb", "s1_q2_lb",
                                      "s1_q2_ub", "s1_q2_ub", "s1_q2_ub",
                                      "s2_q1_ml", "s2_q1_ml", "s2_q1_ml",
                                      "s2_q1_lb", "s2_q1_lb", "s2_q1_lb",
                                      "s2_q1_ub", "s2_q1_ub", "s2_q1_ub",
                                      "s2_q2_ml", "s2_q2_ml", "s2_q1_ml",
                                      "s2_q2_lb", "s2_q2_lb", "s2_q1_lb",
                                      "s2_q2_ub", "s2_q2_ub", "s2_q1_ub"),
                         value=c(70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80))

data_long <- setDT(data_long)

for (i in respondents) {
  for (j in scenarios) {
    for (k in questions) {
      t <- rtriang(n =100000, min=as.numeric(data_long[id==i & variable == paste(j, k, "lb", sep = "_")]$value), 
                   mode=as.numeric(data_long[id==i & variable == paste(j,k, "ml", sep = "_")]$value),
                   max=as.numeric(data_long[id==i & variable == paste(j,k, "ub", sep = "_")]$value))

      # Displaying the samples in a density plot
      plot <- ggplot() + geom_density(aes(t)) + xlim(0,100) + xlab("Probability in %")
      ggsave(plot,filename=paste(i,j,k,".png",sep="_"))
    }
  }
}

【问题讨论】:

  • 您应该提供一个可重现的示例,其中包括提供一些示例数据,并限制自己在每个帖子中回答一个问题。
  • rtriang中没有mode参数。
  • mc2d 包中有。很抱歉没有将包附加到代码中。
  • 好的..我已经更新了答案。那对你有用吗?这篇文章也是同一个stackoverflow.com/questions/61457445/… 吗?
  • 谢谢,可以。不,这是一个单独但相关的问题,我想在一个场景中组合每个问题的 geom_density(),从而减少结果图的数量。

标签: r for-loop apply distribution


【解决方案1】:

tidyverse 方法:

library(tidyverse)
library(mc2d)

all_plots <- data_long %>%
               separate(variable, c("scenarios", "questions", "temp"),
                         sep = "_") %>% 
               group_split(id, scenarios, questions) %>%
               map(~{
                    temp <- rtriang(
                      n =100000, 
                      min = .x %>% filter(temp == 'lb') %>% pull(value),
                      mode = .x %>% filter(temp == 'ml') %>% pull(value),
                      max = .x %>% filter(temp == 'ub') %>% pull(value))
                      plot <- ggplot() + 
                               geom_density(aes(temp)) + xlim(0,100) + 
                               xlab("Probability in %")
                       ggsave(filename = paste(.x$id[1],.x$scenarios[1],
                                        .x$questions[1],".png",sep="_"), plot)
                   })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2018-05-21
    • 2011-12-06
    • 2021-08-09
    • 1970-01-01
    • 2019-06-06
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多