I have some words in my dataframe df each belonging to category A or B. Within each category  the words may be of type 1, 2 or 3. I used the table() function to show how the words are distributed across the categories and types. The output looks like:
         category
type     A    B
1        30  79
2        12  94
3        29  6 
As you can see the table counts frequencies, but I want it to calculate the percentages instead. I have tried prop.table but I get the following error 
Error in FUN(X[[1L]], ...) : only defined on a data frame with all numeric variables
I couldn't find a solution anywhere else; please help. Thank you.
Here's my sample data:
head(items)
       item   type category
[1]    PA100   1    A
[2]    PB101   2    A
[3]    UR360   2    A
[4]    PX977   3    B
[5]    GA008   3    B
[6]    GR446   3    A
As mentioned in the comments, you can use a prop.table on a table object.  In your case, use a margin = 1, which means we want to calculate the percentages across the rows of the table.
> tab <- with(items, table(type, category))
> prop.table(tab, margin = 1)
#     category
# type         A         B
#    1 1.0000000 0.0000000
#    2 1.0000000 0.0000000
#    3 0.3333333 0.6666667
For actual percentages, you can multiply the table by 100
> prop.table(tab, 1)*100
#     category
# type         A         B
#    1 100.00000   0.00000
#    2 100.00000   0.00000
#    3  33.33333  66.66667
where
items <- 
structure(list(item = structure(c(3L, 4L, 6L, 5L, 1L, 2L), .Label = c("GA008", 
"GR446", "PA100", "PB101", "PX977", "UR360"), class = "factor"), 
    type = c(1L, 2L, 2L, 3L, 3L, 3L), category = structure(c(1L, 
    1L, 1L, 2L, 2L, 1L), .Label = c("A", "B"), class = "factor")), .Names = c("item", 
"type", "category"), class = "data.frame", row.names = c(NA, 
-6L))
This might be quite late but sharing it in case someone else faces a similar problem. You can still achieve your required output with table() and prop.table(). You just have to do it in two steps for factor variables.
df = table(items$type, items$category)
prop.table(df)
Read below for further explanation.
For the following dataframe items:
 item type category
PA100  1        A
PB101  2        A
UR360  2        A
PX977  3        B
GA008  3        B
GR446  3        A
First, run the table() command and store it into df
df = table(items$type, items$category)
df
A  B
1  0
2  0
1  2
Then, run your prop.table() command on df as below:
prop.table(df)
A         B
0.1666667 0.0000000
0.3333333 0.0000000
0.1666667 0.3333333
With the round() command you can also specify the number of decimal places you want to keep:
round(prop.table(df),digits = 2)
A     B
0.17  0.00
0.33  0.00
0.17  0.33
And if you wanted to keep the percentages only, you could do the following:
round(100*prop.table(df),digits = 0)
A   B
17  0
33  0
17  33
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