I need to create a table of a certain type and based on a certain template.
This is my data:
df = structure(list(group = c(1L, 1L, 2L, 2L, 2L, 3L, 3L,
using base R:
a = transform(data.frame(table(df)),Freq = sprintf("%d (%3.2f%%)",Freq,prop.table(Freq)*100))
data.frame(t(unstack(a,Freq~degree)))
X1 X2 X3
Mild.severity 3 (30.00%) 3 (30.00%) 2 (20.00%)
Moderate.severity 0 (0.00%) 0 (0.00%) 1 (10.00%)
Severe.severity 0 (0.00%) 0 (0.00%) 1 (10.00%)
you want the fractions, together with the total numbers? Try:
n=table(df$degree,df$group)
df=as.data.frame(cbind(n/colSums(n)*100,n))
I have to admit that I'm not clear on what you're trying to do. Unfortunately your expected output image does not help.
I assume you are asking how to calculate a 2-way contingency table and show both counts and percentages (of total). Here is a tidyverse
possibility
library(tidyverse)
df %>%
group_by(group, degree) %>%
summarise(n = n(), perc = n() / nrow(.)) %>%
mutate(entry = sprintf("%i (%3.2f%%)", n, perc * 100)) %>%
select(-n, -perc) %>%
spread(group, entry, fill = "0 (0.0%%)")
## A tibble: 3 x 4
# degree `1` `2` `3`
# <fct> <chr> <chr> <chr>
#1 Mild severity 3 (30.00%) 3 (30.00%) 2 (20.00%)
#2 Moderate severity 0 (0.0%%) 0 (0.0%%) 1 (10.00%)
#3 Severe severity 0 (0.0%%) 0 (0.0%%) 1 (10.00%)