如何按 r 中列的不同值平均拆分数据帧?
How to split dataframe equally by different values of a column in r?
我有一个数据框 df,我想通过列中的特定值 split/subset 它。
包含这些值的列是列 ID。这样做的原因是因为我想为每个不同的 ID 生成折线图。我的真实数据集有很多唯一 ID,因此如果我为同一页面中的每个 ID 生成折线图,将很难阅读它们。所以我正在考虑将数据集拆分成更小的数据集,其中包含 5 个不同的 ID。有没有人可以提供帮助或可以想出更好的主意?
dput(df)
structure(list(ID = c("F1", "F1", "F1", "F1", "F1", "F1", "F1",
"F2", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3",
"F3", "F3", "F3", "F3", "F3", "F3", "F4", "F4", "F4", "F4", "F4",
"F4", "F4", "F4"), Date = c("22/6/2021", "23/6/2021", "24/6/2021",
"25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "22/6/2021",
"23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021",
"28/6/2021", "29/6/2021", "22/6/2021", "23/6/2021", "24/6/2021",
"25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021",
"30/6/2021", "22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021",
"26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021"), Values = c(9.6,
9.8, 10.2, 9.8, 9.9, 9.9, 9.9, 1.2, 1.2, 1.8, 1.5, 1.5, 1.6,
1.4, 1.1, 3266, 3256, 7044, 6868, 6556, 3405, 3410, 3980, 5567,
59.4, 56, 52.8, 52.4, 55.5, 54, 61, 53.6)), class = "data.frame", row.names = c(NA,
-32L))
这些是折线图的代码行。问题是有很多不同的 ID,当我 运行 这段代码时,所有折线图都在同一页上,很难阅读它们。此外,由于所有内容都被压缩,因此无法显示日期。我可以把所有的线都放在一个图表中,但是每个 ID 的值范围都不同。
ggplot(data = df, aes(x = factor(Date), y = Values)) +
geom_line(aes(group = ID)) + geom_point() +
facet_wrap(~ID, scales = 'free')
我们可以使用 %/%
在使用 match
创建的序列索引上执行 split
library(dplyr)
library(ggplot2)
library(gridExtra)
library(purrr)
lst1 <- df %>%
group_split(grp =((match(ID, unique(ID)) -1) %/% 5 + 1))
现在,使用 map
遍历列表并创建绘图并另存为 .pdf
out <- map(lst1, ~ .x %>%
ggplot(aes(x = factor(Date), y = Values)) +
geom_line(aes(group = ID)) + geom_point() +
facet_wrap(~ID, scales = 'free'))
ggsave(
filename = "plots.pdf",
plot = marrangeGrob(out, nrow=1, ncol=1),
width = 15, height = 9
)
我有一个数据框 df,我想通过列中的特定值 split/subset 它。 包含这些值的列是列 ID。这样做的原因是因为我想为每个不同的 ID 生成折线图。我的真实数据集有很多唯一 ID,因此如果我为同一页面中的每个 ID 生成折线图,将很难阅读它们。所以我正在考虑将数据集拆分成更小的数据集,其中包含 5 个不同的 ID。有没有人可以提供帮助或可以想出更好的主意?
dput(df)
structure(list(ID = c("F1", "F1", "F1", "F1", "F1", "F1", "F1",
"F2", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3",
"F3", "F3", "F3", "F3", "F3", "F3", "F4", "F4", "F4", "F4", "F4",
"F4", "F4", "F4"), Date = c("22/6/2021", "23/6/2021", "24/6/2021",
"25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "22/6/2021",
"23/6/2021", "24/6/2021", "25/6/2021", "26/6/2021", "27/6/2021",
"28/6/2021", "29/6/2021", "22/6/2021", "23/6/2021", "24/6/2021",
"25/6/2021", "26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021",
"30/6/2021", "22/6/2021", "23/6/2021", "24/6/2021", "25/6/2021",
"26/6/2021", "27/6/2021", "28/6/2021", "29/6/2021"), Values = c(9.6,
9.8, 10.2, 9.8, 9.9, 9.9, 9.9, 1.2, 1.2, 1.8, 1.5, 1.5, 1.6,
1.4, 1.1, 3266, 3256, 7044, 6868, 6556, 3405, 3410, 3980, 5567,
59.4, 56, 52.8, 52.4, 55.5, 54, 61, 53.6)), class = "data.frame", row.names = c(NA,
-32L))
这些是折线图的代码行。问题是有很多不同的 ID,当我 运行 这段代码时,所有折线图都在同一页上,很难阅读它们。此外,由于所有内容都被压缩,因此无法显示日期。我可以把所有的线都放在一个图表中,但是每个 ID 的值范围都不同。
ggplot(data = df, aes(x = factor(Date), y = Values)) +
geom_line(aes(group = ID)) + geom_point() +
facet_wrap(~ID, scales = 'free')
我们可以使用 %/%
在使用 match
split
library(dplyr)
library(ggplot2)
library(gridExtra)
library(purrr)
lst1 <- df %>%
group_split(grp =((match(ID, unique(ID)) -1) %/% 5 + 1))
现在,使用 map
遍历列表并创建绘图并另存为 .pdf
out <- map(lst1, ~ .x %>%
ggplot(aes(x = factor(Date), y = Values)) +
geom_line(aes(group = ID)) + geom_point() +
facet_wrap(~ID, scales = 'free'))
ggsave(
filename = "plots.pdf",
plot = marrangeGrob(out, nrow=1, ncol=1),
width = 15, height = 9
)