0

I have likert scale data. I want to display them in an easy (for none-R-users) reading way. Important is that it need to be plain text on the console. No graphics or things like the likert package offers. It not have to be a table() but it should look like a table - no matter what magic R construct is behind it.

This table is just for a first view when beginning with exploring the dataset.

This is the example data

> set.seed(0)
> lik <- sample(c(0:3, NA), 150, replace=TRUE)
> lik <- factor(lik, levels=0:3, labels=c('no', 'maybe no', 'maybe yes', 'yes'))
> tn <- table(lik, useNA="always")
> tn
lik
       no  maybe no maybe yes       yes      <NA> 
       22        33        34        37        24 

I "nice" table could look like this

  no maybe no maybe yes  yes <NA>
n 24       34        37   29   26
% 36       51      55.5 43.5   39

Please pay attention here on the fact that 37 and 29 are displayed without digits!

If I would use rbind() here there are digits. See what I tried so far

> tp <- sapply(tn, function(x) { sum(tn) / 100 * x })
> rbind(tn, tp)
   no maybe no maybe yes  yes <NA>
tn 22     33.0        34 37.0   24
tp 33     49.5        51 55.5   36

A problem with this is, how to set the row names (e.g. tn -< n) and how to prevent to printing the numbers in the first row with digits.

I am fully open for suggestion about how likert data could be display nice and easy (in the meaning of: readable for non-R-users e.g. SPSS-users) in plain text.

buhtz
  • 10,774
  • 18
  • 76
  • 149

1 Answers1

1

If I understand your question correctly, I believe that you can use the kable function from the knitr package to solve your problem:

tab <- rbind(tn, tp)
rownames(tab) <- c("n", "%")
knitr::kable(tab, digits=0)

This results in the following output

|   | no| maybe no| maybe yes| yes| NA|
|:--|--:|--------:|---------:|---:|--:|
|n  | 22|       33|        34|  37| 24|
|%  | 33|       50|        51|  56| 36|

EDIT: sorry I now see that you want to keep the decimals in the second row. Unfortunately kable sets digits column-wise, so this will not help you. What you could do instead is this:

knitr::kable(t(tab))

resulting in

|          |  n|    %|
|:---------|--:|----:|
|no        | 22| 33.0|
|maybe no  | 33| 49.5|
|maybe yes | 34| 51.0|
|yes       | 37| 55.5|
|NA        | 24| 36.0|

EDIT2: Your percentages do not seem to add up to 100%; I am not sure why that is, but the following would give percentages that add up to 100% in total:

tab <- cbind(tn, tn / sum(tn) * 100)
colnames(tab) <- c("n", "%")
knitr::kable(tab, digits = c(0, 1))

|          |  n|    %|
|:---------|--:|----:|
|no        | 22| 14.7|
|maybe no  | 33| 22.0|
|maybe yes | 34| 22.7|
|yes       | 37| 24.7|
|NA        | 24| 16.0|
M. Papenberg
  • 502
  • 2
  • 7
  • Can I replace `0` values with `-` for example? – buhtz May 29 '18 at 08:38
  • I use the example from above using the value 33, but the same works for 0: `tab[tab == 33] <- "-"`. Note that this changes the type of your table to character, but this should not be a problem for printing. – M. Papenberg May 30 '18 at 09:41