如何在 R 中有效地为图表(例如,箱线图)划分数据子集?
How do you efficiently subset data for charts (e.g., boxplots) in R?
我对这个问题进行了相当多的研究,如果我错过了答案,我深表歉意,但我似乎找不到适合我的情况的答案。我想创建 2 个图表(对于每个级别 Account:Dr 和 Cr),每个图表基于三列数据有 6 个箱线图。数据类似于下面的数据(假设有六个日期;01/01/2016-06/01/2016):
Date Days Acct
01/01/16 7 Cr
01/01/16 5 Dr
02/01/16 6 Cr
01/01/16 4 Dr
02/01/16 6 Dr
让我们假设 1,000 行只有 6 个唯一日期值和两个帐户值 -- Cr 和 Dr。我将解释我为获得图表所做的工作,但我知道这不是最多的高效的方式,因为我现在正在使用 for 循环。
我将Cr数据分配给一个数据框,然后将Dr数据分配给另一个数据框。然后我将每个数据框的唯一日期值分配给新的数据框。之后,我 运行 一个 For 循环为每个日期值创建一个数据框并为每个日期值分配日期值,如下所示:
01/01/2016 (Data Frame 1, col A)
5
7
6
02/01/2016 (Data Frame 2, col A)
3
5
然后我 运行 a cbind.fill 将所有数据框组合成一个有 6 列的数据框,其中日期是 header,天数是行中的值。我 运行 该数据框上的箱线图。
感谢您的帮助!
好的,希望我能正确解释您的问题。您需要两个图表(每个级别 Acct 一个),每个图表应该有六个箱线图(每个日期一个框)。由于您的数据集不够大,无法用作示例,因此我创建了自己的数据集并展示了如何使用 ggplot2
和基础 R
.
制作箱线图
library(ggplot2)
set.seed(123)
date_vec = seq(as.Date('2016/1/1'), as.Date('2016/1/6'), by = 'day')
df = data.frame(
Date = sample(date_vec, 1000, replace = T),
Days = rpois(1000, lambda = 2),
Acct = sample(c('Dr','Cr'), 1000, replace = T),
stringsAsFactors = FALSE
)
Date Days Acct
1 2016-01-02 1 Dr
2 2016-01-05 2 Dr
3 2016-01-03 1 Dr
4 2016-01-06 3 Cr
5 2016-01-06 3 Dr
6 2016-01-01 2 Cr
您可以通过 Acct
使用 ggplot2
和 facet_wrap
:
ggplot(df, aes(x = factor(Date), y = Days))+
geom_boxplot()+facet_wrap(~Acct)+theme_bw()+
xlab('Date')
或者,我们可以在基础 R
:
中制作一个两面板箱线图
par(mfrow = c(1,2)) #plot both simultaneously
with(subset(df, Acct == 'Cr'),
boxplot(Days~Date, main = 'Cr Boxplots'))
with(subset(df, Acct == 'Dr'),
boxplot(Days~Date, main = 'Dr Boxplots'))
显然,您需要尝试使用 x 轴标签以获得信息量更大的图表。希望对您有所帮助。
我对这个问题进行了相当多的研究,如果我错过了答案,我深表歉意,但我似乎找不到适合我的情况的答案。我想创建 2 个图表(对于每个级别 Account:Dr 和 Cr),每个图表基于三列数据有 6 个箱线图。数据类似于下面的数据(假设有六个日期;01/01/2016-06/01/2016):
Date Days Acct
01/01/16 7 Cr
01/01/16 5 Dr
02/01/16 6 Cr
01/01/16 4 Dr
02/01/16 6 Dr
让我们假设 1,000 行只有 6 个唯一日期值和两个帐户值 -- Cr 和 Dr。我将解释我为获得图表所做的工作,但我知道这不是最多的高效的方式,因为我现在正在使用 for 循环。
我将Cr数据分配给一个数据框,然后将Dr数据分配给另一个数据框。然后我将每个数据框的唯一日期值分配给新的数据框。之后,我 运行 一个 For 循环为每个日期值创建一个数据框并为每个日期值分配日期值,如下所示:
01/01/2016 (Data Frame 1, col A)
5
7
6
02/01/2016 (Data Frame 2, col A)
3
5
然后我 运行 a cbind.fill 将所有数据框组合成一个有 6 列的数据框,其中日期是 header,天数是行中的值。我 运行 该数据框上的箱线图。
感谢您的帮助!
好的,希望我能正确解释您的问题。您需要两个图表(每个级别 Acct 一个),每个图表应该有六个箱线图(每个日期一个框)。由于您的数据集不够大,无法用作示例,因此我创建了自己的数据集并展示了如何使用 ggplot2
和基础 R
.
library(ggplot2)
set.seed(123)
date_vec = seq(as.Date('2016/1/1'), as.Date('2016/1/6'), by = 'day')
df = data.frame(
Date = sample(date_vec, 1000, replace = T),
Days = rpois(1000, lambda = 2),
Acct = sample(c('Dr','Cr'), 1000, replace = T),
stringsAsFactors = FALSE
)
Date Days Acct
1 2016-01-02 1 Dr
2 2016-01-05 2 Dr
3 2016-01-03 1 Dr
4 2016-01-06 3 Cr
5 2016-01-06 3 Dr
6 2016-01-01 2 Cr
您可以通过 Acct
使用 ggplot2
和 facet_wrap
:
ggplot(df, aes(x = factor(Date), y = Days))+
geom_boxplot()+facet_wrap(~Acct)+theme_bw()+
xlab('Date')
或者,我们可以在基础 R
:
par(mfrow = c(1,2)) #plot both simultaneously
with(subset(df, Acct == 'Cr'),
boxplot(Days~Date, main = 'Cr Boxplots'))
with(subset(df, Acct == 'Dr'),
boxplot(Days~Date, main = 'Dr Boxplots'))
显然,您需要尝试使用 x 轴标签以获得信息量更大的图表。希望对您有所帮助。