In your function 'nbars()', I see the line:
tX = rbind(tX, as.data.frame(cbind(GId = " ",Grp =
names(sG[n]),
S = fm, T = fm)))
It seems that you wish to have a data frame that has numeric variables
'S' and 'T'. The reason why you have character variables of
'S' and 'T'
from your code is that you used a character vector when function
'cbind()' is used. Please see the following example:
> cbind(1:3, 4:6)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> cbind(1:3, LETTERS[1:3])
[,1] [,2]
[1,] "1" "A"
[2,] "2" "B"
[3,] "3" "C"
>
What do you see? I see that numeric values are changed to characters.
Hence, I guess that you will have the output that you want if you change
your code as below:
tX = rbind(tX, as.data.frame(cbind(GId =0,Grp = 0,
S = fm, T = fm)))
Of course you have to do little more works with this change in order to
get final bar plots. I hope this helps.
Chel Hee Lee
On 12/03/2014 12:29 PM, Charles R Parker wrote:> I am trying to create groups of barplots from data that have different
number of records in the groups, in such a way that all of the plots will have
the same numbers and sizes of bars represented even when some of the groups will
have some bars of zero height. The goal then would be to display multiple plots
on a single page using split.screen or something similar. lattice does not seem
suitable because of the data structure it operates on. A simple data structure
that I operate on is given here:
>
>> dput(stplot)
> structure(list(GId = structure(1:11, .Label = c("A1",
"B1", "B2",
> "B3", "B4", "B5", "C1",
"C2", "D1", "D2", "D3"), class =
"factor"),
> Grp = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 4L, 4L,
> 4L), .Label = c("A", "B", "C",
"D"), class = "factor"), S = c(12.3,
> 23.8, 0, 7.6, 14.32, 1.9, 5.1, 0, 14.6, 10.1, 8.7), T = c(5L,
> 12L, 2L, 1L, 4L, 1L, 1L, 9L, 5L, 6L, 3L)), .Names = c("GId",
> "Grp", "S", "T"), class =
"data.frame", row.names = c(NA, -11L
> ))
>
>
> My code, which doesn't quite work is:
>
>> nbars <-
> function(x){
> sG = summary(x$Grp)
> mG = max(sG)
> for(n in 1:length(sG)){
> tX = subset(x,x$Grp==names(sG[n]))
> if(nrow(tX) < mG){
> fm = as.numeric(rep(length = mG - nrow(tX), 0))
> tX = rbind(tX, as.data.frame(cbind(GId = " ",Grp =
names(sG[n]),
> S = fm, T = fm)))
> }
> #print(tX)
> #dput(t(as.matrix(tX[,3:4])))
> barplot(t(as.matrix(tX[,3:4])),beside=TRUE, names.arg=tX$GId,
> col = c("navy","gray"))
> }
> }
>
>
> The function nbars first gets the list of group values with their counts
'summary(x$Grp)'.
> It then determines the maximum number of bar pairs in the largest of the
groups 'max(sG)', and uses this to determine how much each smaller group
needs to be padded to fill out the proper number of bars in the ultimate
barplots, using the for loop. If you uncomment the #print(tX) you can see that
this works...sort of. The problem becomes apparent if you uncomment the #dput.
This shows that the tX treats the S and T values as characters rather than as
numeric values. This prevents the barplots from working. By changing the for
loop to begin 'for(n in 2:length(sG)' the second plot will display
correctly, but the third plot will fail.
>
> I have tried various options to force the S and T variables to be numeric,
but none of those have worked (as.numeric(fm), as.matrix(fm), as.vector(fm)) in
the 'if(nrow(tX) < mG)' loop, but these have not worked.
>
> If there is a sure-fire way to solve the problem I would be grateful.
>
> Thanks.
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>