r - 循环遍历数据框列表并为每个数据框保存单独的图表
问题描述
新手编码器在这里。我正在编写一个脚本,该脚本会在一年内生成不同的个人情绪评级图表。到目前为止,我可以提取一个人 (ID) 的数据并创建他们各自的图表(下面的脚本),但是对于一大群人来说,手动执行这是不切实际的。我需要一种方法让这个脚本在列表中循环,并为每个人保存单独的图表。我曾尝试使用 lapply,但我不确定如何让它包含所有这些步骤并不断遇到错误(例如找不到对象“周”)。任何帮助将不胜感激!
ALIFE_transpose_split = split(ALIFE_transposed, ALIFE_transposed$ID)
#Loop would start here, pulling 1038 as an example
ALIFE_1038 <- ALIFE_transpose_split[["1038"]]
ALIFE_1038_plot <- ALIFE_1038 %>%
select(Week, MDD_PSR, GAD_PSR, ADHD_PSR) %>%
gather(key = "Module", value = "PSR", -Week)
ggplot(ALIFE_1038_plot, aes(x = Week, y = PSR)) +
geom_line(aes(color = Module, linetype = Module)) +
scale_color_manual(values = c("yellow4", "blue", "darkred")) +
scale_linetype_manual(values = c("solid","twodash", "solid")) +
ylim(1, 6)
ggsave(
filename="ALIFE_1038_plot_20210122.png",
plot = last_plot(),
device = NULL,
path = "../..",
scale = 1,
width = 13,
height = 8,
units = c("in"),
dpi = 300,
limitsize = TRUE,
)
输出链接: ALIFE_1038_plot_20210122.png
这是我尝试过的,错误返回:
ALIFE_transpose_split <- lapply(ALIFE_transpose_split, function(x) x %>%
select(Week, MDD_PSR, GAD_PSR, ADHD_PSR) %>%
gather(key = "Module", value = "PSR", -Week) )
plotdata <- function(x) {
ggplot(data = x, aes(x = Week, y = PSR)) +
geom_line(aes(color = Module, linetype = Module)) +
scale_color_manual(values = c("yellow4", "blue", "darkred")) +
scale_linetype_manual(values = c("solid","twodash", "solid")) +
ylim(1, 6)
ggsave(
filename=ALIFE_transpose_split$ID,
plot = last_plot(),
device = NULL,
path = "../..",
scale = 1,
width = 13,
height = 8,
units = c("in"),
dpi = 300,
limitsize = TRUE,
)
}
lapply(ALIFE_transpose_split, plotdata)
Error: `device` must be NULL, a string or a function.
Run `rlang::last_error()` to see where the error occurred.
7.
stop(fallback)
6.
signal_abort(cnd)
5.
abort("`device` must be NULL, a string or a function.")
4.
plot_dev(device, filename, dpi = dpi)
3.
ggsave(filename = ALIFE_transpose_split$ID, plot = last_plot(),
device = NULL, path = "../..", scale = 1, width = 13, height = 8,
units = c("in"), dpi = 300, limitsize = TRUE, )
2.
FUN(X[[i]], ...)
1.
lapply(ALIFE_transpose_split, plotdata)
这是列表数据的样子:
> dput(ALIFE_transpose_split)
list(`1027` = structure(list(ID = c(1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027), Week = c(1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64), MDD_PSR = c(NA, NA, NA, 2, 2, 2,
2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), ADHD_PSR = c(NA,
NA, NA, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA), GAD_PSR = c(NA, NA, NA, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA,
-64L), class = c("tbl_df", "tbl", "data.frame")), `1038` = structure(list(
ID = c(1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038), Week = c(1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64), MDD_PSR = c(NA,
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 5, 5, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA), ADHD_PSR = c(NA, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA), GAD_PSR = c(NA, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA)), row.names = c(NA, -64L), class = c("tbl_df", "tbl",
"data.frame")))
解决方案
如果你 facet_wrap 怎么办?
从您的数据创建 df...
ID <- c(1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027)
Week = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
58, 59, 60, 61, 62, 63, 64)
MDD_PSR = c(NA, NA, NA, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
ADHD_PSR = c(NA, NA, NA, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA)
GAD_PSR = c(NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
b <- data.frame(ID,Week, MDD_PSR,ADHD_PSR,GAD_PSR)
ID <- c(1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
1038, 1038, 1038, 1038, 1038)
Week <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64)
MDD_PSR <- c(NA,2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 5, 5, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA)
ADHD_PSR <- c(NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA)
GAD_PSR <- c(NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
c <- data.frame(ID,Week, MDD_PSR,ADHD_PSR,GAD_PSR)
f <- rbind.data.frame(b,c)
让图表彼此相邻显示
c_plot <- f %>%
group_by(ID) %>%
gather(key = "Module", value = "PSR", -Week, -ID)
ggplot(data = c_plot , aes(x = Week, y = PSR)) +
geom_line(aes(color = Module, linetype = Module)) +
scale_color_manual(values = c("yellow4", "blue", "darkred")) +
scale_linetype_manual(values = c("solid","twodash", "solid")) +
ylim(1, 6)+
facet_wrap(.~ID)
或者...这会从您的代码中获取错误
c_plot <- f %>%
group_by(ID) %>%
gather(key = "Module", value = "PSR", -Week, -ID)
ALIFE_transpose_split = split(c_plot, c_plot$ID)
plotdata <- function(x) {
ggplot(data = x, aes(x = Week, y = PSR)) +
geom_line(aes(color = Module, linetype = Module)) +
scale_color_manual(values = c("yellow4", "blue", "darkred")) +
scale_linetype_manual(values = c("solid","twodash", "solid")) +
ylim(1, 6)
ggsave(
filename="figure%03d.pdf",
plot = last_plot(),
device = "pdf",
path = "./",
scale = 1,
width = 13,
height = 8,
dpi = 300,
units = c("in"),
limitsize = TRUE)
}
推荐阅读
- wordpress - 当有人单击与 URL 共享属性图像的共享图标时,我该如何做到这一点
- angular - 打开相同 Ngx-Bootstrap 模态的多板
- magento2 - 如何在服务器的子目录中部署 magento pwastudio?
- macos - macOS 终端,User 文件夹的目录
- flutter - 在 dart 中读取 UTF-16 LE 文件
- java - Android Google Map如何检查用户是否在标记矩形区域
- android - 如何在 android 中使用 style.xml 设置填充和文本类型面
- ios - 为什么我不能在@IBAction func 之外调用函数 StartTime?
- java - 如何在 Prometheus 中持续轮询 JSON 数据?
- python - 如何在熊猫中执行条件分组计算并前向填充零值