[英]Replacing nested for loop that generates figures with apply family
我有一個來自調查的定量數據集。 我想 plot 擬合我擁有的值的三角形分布(最小lb
,最大ub
和模式ml
)。 請注意,我使用的是rtriang()
,因為我的數據不包含可以擬合密度 function 的分位數。 至少這是我的理解。
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="_"))
}
}
}
一個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)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.