[R] Simple 'frequency' function?

Marc Schwartz MSchwartz at MedAnalytics.com
Fri Jul 9 17:50:35 CEST 2004


On Fri, 2004-07-09 at 10:43, Dan Bolser wrote:
> On Fri, 9 Jul 2004, Uwe Ligges wrote:
> 
> >Dan Bolser wrote:
> >
> >> Hi, I have designed the following function to extract count frequencies
> >> from an array of integers. For example...
> >> 
> >> # Tipical array
> >> x <- cbind(1,1,1,1,1,2,2,2,2,3,3,3,3,4,5,6,7,22)
> >> 
> >> # Define the frequency function
> >> frequency <-
> >>   function(x){
> >>     max <- max(x)
> >>     j <- c()
> >>     for(i in 1:max){
> >>       j[i] <- length(x[x==i])
> >>     }
> >>     return(j)
> >> }
> >> 
> >> fre <- frequency(x)
> >> plot(fre)
> >> 
> >> How can I ... 
> >> 
> >> 1) Make this a general function so my array could be of the form
> >> 
> >> # eats!
> >> x <- cbind( "egg","egg","egg","egg","ham","ham","ham","ham","chicken" )
> >> 
> >> fre <- frequency(x)
> >> plot(fre)
> >> 
> >> 2) Make frequency return an object which I can call plot on (allowing the
> >> prob=TRUE option).
> >
> >
> >See ?table:
> >
> >   table(x)
> >   plot(table(x))
> >   plot(table(x) / sum(table(x)))
> >
> 
> Sorry, why does 
> 
> plot(table(x),log='y')
> 
> fail?
> 
> I am looking at count/frequency distributions which are linear on log/log
> scales.


Presumably you are getting the following:

> x <- cbind( "egg","egg","egg","egg","ham",
              "ham","ham","ham","chicken" )
> plot(table(x),log='y')
Error in plot.window(xlim, ylim, log, asp, ...) :
        Infinite axis extents [GEPretty(0,inf,5)]
In addition: Warning message:
Nonfinite axis limits [GScale(-inf,0.60206,2, .); log=1]

The problem here is that the range for the default y axis is being set
to limits that cannot be used on a log scale.

If you review the code for plot.table(), which is the method that will
be used here, you see the function definition as follows:

> graphics:::plot.table
function (x, type = "h", ylim = c(0, max(x)), lwd = 2, xlab = NULL,
    ylab = NULL, frame.plot = is.num, ...)

Note that the default ylim is set to have a min value of 0, which of
course you cannot have on a log scale.

Thus, instead, use the following:

plot(table(x), log = "y", ylim = range(table(x)))

or otherwise explicitly define the y axis range, such that the min value
is >0.

Note also that the default plot type here is 'h', which will result in a
histogram type of plot using vertical lines. If you want a scatterplot
type of graphic, use:

plot(table(x), log = "y", ylim = range(table(x)), type = "p")

HTH,

Marc Schwartz




More information about the R-help mailing list