I'm new with R. I need to generate a simple Frequency Table (as in books) with cumulative frequency and relative frequency.
So I want to generate from some simple data like
> x [1] 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10 12 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10 [36] 12 15 19 20 22 20 19 19 19
a table like:
frequency cumulative relative (9.99,11.7] 2 2 0.04545455 (11.7,13.4] 2 4 0.04545455 (13.4,15.1] 1 5 0.02272727 (15.1,16.9] 10 15 0.22727273 (16.9,18.6] 22 37 0.50000000 (18.6,20.3] 6 43 0.13636364 (20.3,22] 1 44 0.02272727
I know it should be simple, but I don't know how.
I got some results using this code:
factorx <- factor(cut(x, breaks=nclass.Sturges(x))) as.matrix(table(factorx))
find the frequency for each class interval. locate the endpoint for each class interval. calculate the cumulative frequency by adding the numbers in the Frequency column. record all results in the table.
The cumulative frequency table can be calculated by the frequency table, using the cumsum() method. This method returns a vector whose corresponding elements are the cumulative sums.
You're close! There are a few functions that will make this easy for you, namely cumsum()
and prop.table()
. Here's how I'd probably put this together. I make some random data, but the point is the same:
#Fake data x <- sample(10:20, 44, TRUE) #Your code factorx <- factor(cut(x, breaks=nclass.Sturges(x))) #Tabulate and turn into data.frame xout <- as.data.frame(table(factorx)) #Add cumFreq and proportions xout <- transform(xout, cumFreq = cumsum(Freq), relative = prop.table(Freq)) #----- factorx Freq cumFreq relative 1 (9.99,11.4] 11 11 0.25000000 2 (11.4,12.9] 3 14 0.06818182 3 (12.9,14.3] 11 25 0.25000000 4 (14.3,15.7] 2 27 0.04545455 5 (15.7,17.1] 6 33 0.13636364 6 (17.1,18.6] 3 36 0.06818182 7 (18.6,20] 8 44 0.18181818
The base functions table
, cumsum
and prop.table
should get you there:
cbind( Freq=table(x), Cumul=cumsum(table(x)), relative=prop.table(table(x))) Freq Cumul relative 10 2 2 0.04545455 12 2 4 0.04545455 15 1 5 0.02272727 16 10 15 0.22727273 17 16 31 0.36363636 18 6 37 0.13636364 19 4 41 0.09090909 20 2 43 0.04545455 22 1 44 0.02272727
With cbind and naming of the columns to your liking this should be pretty easy for you in the future. The output from the table function is a matrix, so this result is also a matrix. If this were being done on something big it would be more efficient todo this:
tbl <- table(x) cbind( Freq=tbl, Cumul=cumsum(tbl), relative=prop.table(tbl))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With