如何在 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 使用 ggplot2facet_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 轴标签以获得信息量更大的图表。希望对您有所帮助。