Skip to contents

This function helps analyse a block of questions or matrix questions into a single table. It also lets the user cut these questions by other questions in the data. The block of questions mush have the same response options.

Usage

build_qtable(
  x,
  block_cols,
  cols = NULL,
  table_title = "",
  use_questions = FALSE,
  use_NA = FALSE,
  wt = NULL,
  footnote = ""
)

Arguments

x

a data frame or tidy object

block_cols

<tidyr_tidy_select> statement. These are the columns that make up the question block, they must have the same response option. Most question block columns start with the same piece of text, so you should use starts_with('column_text'). See the Examples below.

cols

<tidyr_tidy_select> statement. These are the column(s) that we want to cut the questions in the question block by.

table_title

a string. The title of the table sheet

use_questions

a logical. If the data has column labels (was a imported .sav) file, convert the column label to a footnote with the question.

use_NA

a logical. Whether to include NA values in the table. For more complicated NA processing post creation, we recommend using filter.

wt

a quoted or unquote column name. Specify a weighting variable, if NULL no weight is applied.

footnote

a character vector. Optional parameter to pass a custom footnote to the question, this parameter overwrites use_questions.

Value

a xlr_table object. Use write_xlsx to write to an excel file. See xlr_table for more information.

Details

This function and its family (build_table, build_qtable) is designed to work with data with columns of type haven::labelled, which is the default format of data read with haven::read_sav/has the format of .sav. .sav is the default file function type of data from SPSS and can be exported from popular survey providers such as Qualtrics. When you read in data with haven::read_sav it imports data with the questions, labels for the response options etc.

By default this function converts labelled to a xlr_vector by default (and underlying it is a character() type).

See labelled and read_sav if you would like more details on the importing type.

Examples

library(xlr)

# You can use this function to get a block of questions
build_qtable(
  clothes_opinions,
  starts_with("Q1"),
  table_title = "This is an example table")
#> 
#> ── This is an example table ────────────────────────────────────────────────────
#> # A xlr_table: 20 x 4
#>    `Question Block`        value                   N Percent
#>    <x_vctr>                <x_vctr>          <x_int> <x_pct>
#>  1 Pants are good to wear  Strongly Disagree     180     18%
#>  2 Pants are good to wear  Disagree              194     20%
#>  3 Pants are good to wear  Neutral               204     21%
#>  4 Pants are good to wear  Agree                 205     21%
#>  5 Pants are good to wear  Strongly Agree        192     20%
#>  6 Shirts are good to wear Strongly Disagree     192     20%
#>  7 Shirts are good to wear Disagree              173     18%
#>  8 Shirts are good to wear Neutral               227     23%
#>  9 Shirts are good to wear Agree                 195     20%
#> 10 Shirts are good to wear Strongly Agree        188     19%
#> 11 Shoes are good to wear  Strongly Disagree     210     22%
#> 12 Shoes are good to wear  Disagree              191     20%
#> 13 Shoes are good to wear  Neutral               188     19%
#> 14 Shoes are good to wear  Agree                 211     22%
#> 15 Shoes are good to wear  Strongly Agree        175     18%
#> 16 Q1_4                    Strongly Disagree     201     21%
#> 17 Q1_4                    Disagree              190     19%
#> 18 Q1_4                    Neutral               183     19%
#> 19 Q1_4                    Agree                 203     21%
#> 20 Q1_4                    Strongly Agree        198     20%

# Another way you could select the same columns
build_qtable(
  clothes_opinions,
  c(Q1_1,Q1_2,Q1_3,Q1_4),
  table_title = "This is an example table")
#> 
#> ── This is an example table ────────────────────────────────────────────────────
#> # A xlr_table: 20 x 4
#>    `Question Block`        value                   N Percent
#>    <x_vctr>                <x_vctr>          <x_int> <x_pct>
#>  1 Pants are good to wear  Strongly Disagree     180     18%
#>  2 Pants are good to wear  Disagree              194     20%
#>  3 Pants are good to wear  Neutral               204     21%
#>  4 Pants are good to wear  Agree                 205     21%
#>  5 Pants are good to wear  Strongly Agree        192     20%
#>  6 Shirts are good to wear Strongly Disagree     192     20%
#>  7 Shirts are good to wear Disagree              173     18%
#>  8 Shirts are good to wear Neutral               227     23%
#>  9 Shirts are good to wear Agree                 195     20%
#> 10 Shirts are good to wear Strongly Agree        188     19%
#> 11 Shoes are good to wear  Strongly Disagree     210     22%
#> 12 Shoes are good to wear  Disagree              191     20%
#> 13 Shoes are good to wear  Neutral               188     19%
#> 14 Shoes are good to wear  Agree                 211     22%
#> 15 Shoes are good to wear  Strongly Agree        175     18%
#> 16 Q1_4                    Strongly Disagree     201     21%
#> 17 Q1_4                    Disagree              190     19%
#> 18 Q1_4                    Neutral               183     19%
#> 19 Q1_4                    Agree                 203     21%
#> 20 Q1_4                    Strongly Agree        198     20%

# Yet another way to select the same columns
build_qtable(
  clothes_opinions,
  all_of(c("Q1_1","Q1_2","Q1_3","Q1_4")),
  table_title = "This is an example table")
#> 
#> ── This is an example table ────────────────────────────────────────────────────
#> # A xlr_table: 20 x 4
#>    `Question Block`        value                   N Percent
#>    <x_vctr>                <x_vctr>          <x_int> <x_pct>
#>  1 Pants are good to wear  Strongly Disagree     180     18%
#>  2 Pants are good to wear  Disagree              194     20%
#>  3 Pants are good to wear  Neutral               204     21%
#>  4 Pants are good to wear  Agree                 205     21%
#>  5 Pants are good to wear  Strongly Agree        192     20%
#>  6 Shirts are good to wear Strongly Disagree     192     20%
#>  7 Shirts are good to wear Disagree              173     18%
#>  8 Shirts are good to wear Neutral               227     23%
#>  9 Shirts are good to wear Agree                 195     20%
#> 10 Shirts are good to wear Strongly Agree        188     19%
#> 11 Shoes are good to wear  Strongly Disagree     210     22%
#> 12 Shoes are good to wear  Disagree              191     20%
#> 13 Shoes are good to wear  Neutral               188     19%
#> 14 Shoes are good to wear  Agree                 211     22%
#> 15 Shoes are good to wear  Strongly Agree        175     18%
#> 16 Q1_4                    Strongly Disagree     201     21%
#> 17 Q1_4                    Disagree              190     19%
#> 18 Q1_4                    Neutral               183     19%
#> 19 Q1_4                    Agree                 203     21%
#> 20 Q1_4                    Strongly Agree        198     20%
# You can also cut all questions in the block by a single column
build_qtable(
  clothes_opinions,
  starts_with("Q1"),
  gender2,
  table_title = "This is the second example table")
#> 
#> ── This is the second example table ────────────────────────────────────────────
#> # A xlr_table: 60 x 5
#>    gender2  `Question Block`        value                   N Percent
#>    <x_vctr> <x_vctr>                <x_vctr>          <x_int> <x_pct>
#>  1 male     Pants are good to wear  Strongly Disagree      75     17%
#>  2 male     Pants are good to wear  Disagree               96     21%
#>  3 male     Pants are good to wear  Neutral                97     21%
#>  4 male     Pants are good to wear  Agree                  89     20%
#>  5 male     Pants are good to wear  Strongly Agree         95     21%
#>  6 male     Shirts are good to wear Strongly Disagree      85     19%
#>  7 male     Shirts are good to wear Disagree               84     19%
#>  8 male     Shirts are good to wear Neutral                96     21%
#>  9 male     Shirts are good to wear Agree                  90     20%
#> 10 male     Shirts are good to wear Strongly Agree         97     21%
#> # ℹ 50 more rows

# You can also cut all questions in the block by a multiple columns
# By setting `use_questions=TRUE` then the footnote will be the questions
# labels, for the cut questions
build_qtable(
  clothes_opinions,
  starts_with("Q1"),
  c(gender2,age_group),
  table_title = "This is the third example table",
  use_questions = TRUE)
#> 
#> ── This is the third example table ─────────────────────────────────────────────
#> # A xlr_table: 240 x 6
#>    gender2  age_group `Question Block`        value                   N Percent
#>    <x_vctr> <x_vctr>  <x_vctr>                <x_vctr>          <x_int> <x_pct>
#>  1 male     18-30     Pants are good to wear  Strongly Disagree      16     14%
#>  2 male     18-30     Pants are good to wear  Disagree               21     18%
#>  3 male     18-30     Pants are good to wear  Neutral                26     23%
#>  4 male     18-30     Pants are good to wear  Agree                  22     19%
#>  5 male     18-30     Pants are good to wear  Strongly Agree         29     25%
#>  6 male     18-30     Shirts are good to wear Strongly Disagree      18     16%
#>  7 male     18-30     Shirts are good to wear Disagree               23     20%
#>  8 male     18-30     Shirts are good to wear Neutral                26     23%
#>  9 male     18-30     Shirts are good to wear Agree                  18     16%
#> 10 male     18-30     Shirts are good to wear Strongly Agree         29     25%
#> # ℹ 230 more rows
#> Questions
#> The gender of the participant

# You can also use weights, these weights can be either doubles or integers
# based weights
# You can also set a footnote
build_qtable(
  clothes_opinions,
  starts_with("Q1"),
  age_group,
  table_title = "This is the fourth example table",
  wt = weight,
  footnote = paste0("This is a footnote, you can use it if you want ",
                    "more detail in your table."))
#> 
#> ── This is the fourth example table ────────────────────────────────────────────
#> # A xlr_table: 80 x 5
#>    age_group `Question Block`        value                    N Percent
#>    <x_vctr>  <x_vctr>                <x_vctr>           <x_dbl> <x_pct>
#>  1 18-30     Pants are good to wear  Strongly Disagree 39,736.0     16%
#>  2 18-30     Pants are good to wear  Disagree          48,447.0     19%
#>  3 18-30     Pants are good to wear  Neutral           60,462.0     24%
#>  4 18-30     Pants are good to wear  Agree             47,143.0     19%
#>  5 18-30     Pants are good to wear  Strongly Agree    58,756.0     23%
#>  6 18-30     Shirts are good to wear Strongly Disagree 47,604.0     19%
#>  7 18-30     Shirts are good to wear Disagree          48,981.0     19%
#>  8 18-30     Shirts are good to wear Neutral           56,225.0     22%
#>  9 18-30     Shirts are good to wear Agree             48,690.0     19%
#> 10 18-30     Shirts are good to wear Strongly Agree    53,044.0     21%
#> # ℹ 70 more rows
#> This is a footnote, you can use it if you want more detail in your table.