Mina25
Mina25

Reputation: 1

R grouped barplot

data_subset_1
      Date Customer.Dimension Product.Dimension Channel.Dimension Sales.Price
1 Dec-13                Jan             Phone               FtF        2250
2 Dec-13               Koos             Phone               Web        1500
3 Dec-13                Jan          Computer               Web        3500
4 Dec-13               Koos          Computer               FtF        5250
5 Dec-13                Jan             eBook               FtF         375
6 Dec-13               Koos             eBook         Telephone         300
7 Dec-13               Koos          Computer               Web        3500
8 Dec-13                Jan             Phone               Web        1500
9 Dec-13               Piet          Computer               Web        3500
10 Dec-13               Koos          Computer         Telephone        4200
11 Dec-13                Jan          Computer               Web        3500
12 Dec-13               Koos             Phone               FtF        2250
13 Dec-13               Piet             eBook               Web         250
14 Dec-13               Koos          Computer               Web        3500
15 Dec-13               Koos             Phone               Web        1500
16 Jan-14               Koos             eBook               Web         250
17 Jan-14                Jan             eBook               Web         250
18 Jan-14               Koos          Computer               FtF        5250
19 Jan-14               Koos             eBook         Telephone         300
20 Jan-14                Jan             eBook               FtF         375
21 Jan-14               Koos          Computer               Web        3500
22 Jan-14               Koos          Computer               Web        3500
23 Jan-14               Koos          Computer               FtF        5250
24 Jan-14               Piet             eBook               Web         250
25 Jan-14               Piet             eBook               Web         250
26 Jan-14               Koos          Computer               Web        3500
27 Jan-14               Koos             Phone               Web        1500
28 Jan-14                Jan          Computer               Web        3500
29 Jan-14               Koos             Phone               Web        1500
30 Jan-14               Koos             eBook               FtF         375
31 Feb-14               Piet          Computer         Telephone        4200
32 Feb-14               Koos             Phone         Telephone        1800
33 Feb-14               Piet             eBook         Telephone         300
34 Feb-14               Koos             eBook         Telephone         300
35 Feb-14               Koos          Computer               Web        3500
36 Feb-14                Jan          Computer               FtF        5250
37 Feb-14                Jan          Computer               Web        3500
38 Feb-14                Jan          Computer               FtF        5250
39 Feb-14               Koos             Phone               Web        1500
40 Feb-14               Koos             Phone         Telephone        1800
41 Feb-14               Koos          Computer         Telephone        4200
42 Feb-14               Piet          Computer               Web        3500
43 Feb-14               Koos             eBook               Web         250
44 Feb-14                Jan          Computer               FtF        5250
45 Feb-14               Koos             eBook               FtF         375
46 Mar-14               Koos          Computer               FtF        5250
47 Mar-14               Piet             Phone               Web        1500
48 Mar-14               Koos          Computer               FtF        5250
49 Mar-14               Koos             eBook               FtF         375
50 Mar-14               Piet             Phone               FtF        2250
51 Mar-14               Piet             Phone         Telephone        1800
52 Mar-14               Koos             eBook         Telephone         300
53 Mar-14               Piet             Phone               Web        1500
54 Mar-14               Koos             eBook         Telephone         300
55 Mar-14                Jan          Computer               Web        3500
56 Mar-14                Jan          Computer               Web        3500
57 Mar-14               Piet          Computer               FtF        5250
58 Mar-14               Koos          Computer               FtF        5250
59 Mar-14               Koos          Computer         Telephone        4200
60 Mar-14                Jan          Computer         Telephone        4200
61 Apr-14               Piet             Phone               Web        1500
62 Apr-14               Koos          Computer               Web        3500
63 Apr-14                Jan          Computer               Web        3500
64 Apr-14               Koos          Computer         Telephone        4200
65 Apr-14               Piet             Phone               Web        1500
66 Apr-14               Koos          Computer               Web        3500
67 Apr-14               Koos          Computer               FtF        5250
68 Apr-14               Piet             eBook               Web         250
69 Apr-14               Koos          Computer               Web        3500
70 Apr-14               Koos          Computer               FtF        5250
71 Apr-14                Jan             Phone         Telephone        1800
72 Apr-14                Jan             eBook               Web         250
73 Apr-14               Koos          Computer               FtF        5250
74 Apr-14                Jan          Computer               FtF        5250
75 Apr-14               Koos          Computer               Web        3500
76 May-14               Koos             eBook               Web         250
77 May-14               Koos             Phone               Web        1500
78 May-14                Jan             eBook               Web         250
79 May-14               Piet             eBook         Telephone         300
80 May-14                Jan             Phone               Web        1500
81 May-14               Koos             eBook         Telephone         300
82 May-14               Piet             eBook               Web         250
83 May-14               Koos          Computer               Web        3500
84 May-14               Piet          Computer               FtF        5250
85 May-14               Piet             eBook         Telephone         300
86 May-14               Koos             eBook               Web         250
87 May-14                Jan             eBook               Web         250
88 May-14               Koos             Phone               FtF        2250
89 May-14               Piet             eBook         Telephone         300
90 May-14               Koos          Computer         Telephone        4200

z <- 1:nlevels( unique(data_subset_1$Product.Dimension) )
prod <- levels(data_subset_1$Product.Dimension)
m <- 1
conc_data_6_monhts <- list()
conc_data_3_monhts <- list()
prod_desc <- list()

while( m <= max(z) ) {

conc_data_6_monhts[[m]] <- mean( c( data_subset_1[ which( data_subset_1$Date == "May-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Apr-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Mar-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Feb-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Jan-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Dec-13" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"]
)
)

conc_data_3_monhts[[m]] <- mean( c( data_subset_1[ which( data_subset_1$Date == "May-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Apr-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"],
data_subset_1[ which( data_subset_1$Date == "Mar-14" & data_subset_1$Product.Dimension == prod[m] ), "Sales.Price"]
)
)

prod_desc[[m]] <- prod[m]

m <- m + 1

}

data_subset_1_means <- matrix(
data = c(conc_data_6_monhts, conc_data_3_monhts),
ncol = max(z),
byrow = FALSE,
dimnames = list(                        
c("6 Month Average", "3 Month Average"),
c( prod[z] )
)
)

I have a matrix that looks like

     6 Month Average 3 Month Average
Computer 4148.905        4272.222       
eBook    300.4237        289.5833       
Phone    1778.571        1825.862

from which I'd like to get a grouped barplot. When I simply type

barplot( data_subset_1_means )

I get a stacked barplot. When I change this to

barplot( data_subset_1_means, beside = TRUE )

I get the following error:

Error in -0.01 * height : non-numeric argument to binary operator

Any advice on how I can get rid of this error?

Upvotes: 0

Views: 192

Answers (1)

nico
nico

Reputation: 51640

I am not completely sure why you get the error, but if you use unlist when joining conc_data_6_monhts and conc_data_3_monhts the problem disappears.

So:

data_subset_1_means <- matrix(
data = c(unlist(conc_data_6_monhts), unlist(conc_data_3_monhts)),
ncol = max(z),
byrow = FALSE,
dimnames = list(                        
c("6 Month Average", "3 Month Average"),
c( prod[z] )
)
)

By the way, it is much more clean to do:

data_subset_1_means <- cbind(unlist(conc_data_6_monhts), 
                             unlist(conc_data_3_monhts))
colnames(data_subset_1_means) <- c("6 Month Average", "3 Month Average")
rownames(data_subset_1_means) <- prod[z]

Furthermore I would suggest converting your dates into POSIXct objects (you'll need to add a day in front, I am assuming the first of the month)

data_subset_1$Date <- as.POSIXct(paste0("01-",data_subset_1$Date), 
                      format="%d-%b-%Y")

You can then much easier filter your data and for instance use aggregate to calculate the means.

For instance, something on the lines of:

data_subset_1$BeforeMarch <- data_subset_1$Date<as.POSIXct("14-03-01")
aggregate(data_subset_1$Sales.Price, by=list(data_subset_1$BeforeMarch), 
          FUN=mean)

Upvotes: 1

Related Questions