Learn R Programming

⚠️There's a newer version (3.1.0) of this package.Take me there.

volkeR-Package

High-level functions for tabulating, charting and reporting survey data.

Getting started

# Install the package (see below), then load it
library(volker)

# Load example data from the package
data <- volker::chatgpt

# Create your first table and plot, counting answers to an item battery
report_counts(data, starts_with("cg_adoption_social"))

# Create your first table and plot, reporting mean values of the item battery
report_metrics(data, starts_with("cg_adoption_social"))

See further examples in vignette("introduction", package="volker").

Don’t miss the template feature: Within RStudio, create a new Markdown document, select From template, choose and finally knit the volkeR Report! It’s a blueprint for your own tidy reports.

Concept

The volkeR package is made for creating quick and easy overviews about datasets. It handles standard cases with a handful of functions. Basically you select one of the following functions and throw your data in:

  • Categorical variables: report_counts()
  • Metric variables: report_metrics()

The report functions combine tables, plots and, optionally, effect size calculations. To request only one of those outputs, directly use the respective function:

  • Charts: plot_metrics() and plot_counts()
  • Tables: tab_metrics() and tab_counts()
  • Effects: effect_metrics() and effect_counts()

Which one is best? That depends on your objective:

  • Table or plot?
    A plot is quick to capture, data from a table is better for further calculations. Functions for tables start with tab, functions for plots with plot. If in doubt, create both at once with the report-functions.

  • Categorical or metric variables?
    Categories can be counted, for metric variables distribution parameters such as the mean and standard deviation are calculated. Functions for categorical variables contain counts in their name, those for metric metrics.

  • Individual, grouped or correlated?
    Groups can be compared (e.g., the average age by gender) or cross-tabulated (e.g. combinations of education level and gender) by providing a grouping column as third parameter of table, plot and report functions. To calculate correlations and show scatter plots, provide a metric column and set the metric-Paramter to TRUE. The effect-functions calculate effect sizes and statistical tests for group comparisons and correlations.

  • One variable or item batteries?.
    Item batteries are often used in surveys. Each item results in a single variable, but the variables are all measured with the same scale (e.g. 1 = not at all to 5 = fully applies). To summarise multiple items send a column selection to the functions by using tidyselect mechanisms such as starts_with().

  • Markdown or data frame?
    All table functions return data frames that can be processed further. The tables have their own print function, so the output of all functions can be used directly in Markdown documents to display neatly formatted tables and plots. The report-functions create tidy interactive tabsheets to switch between plots, tables, and indexes.

Examples

All functions take a data frame as their first argument, followed by a column selection, and optionally a grouping column. Reproduce the examples above:

  • One metric variable: report_metrics(data, sd_age)
  • One categorical variable: report_counts(data, sd_gender)
  • Grouped metric variable: report_metrics(data, sd_age, sd_gender)
  • Grouped categorical variable: report_counts(data, adopter, sd_gender)
  • Multiple metric variables: report_metrics(data, starts_with("cg_adoption"))
  • Multiple categorical variables: report_counts(data, starts_with("cg_adoption"))

The column selections determine which type of output is generated. In the second parameter (after the dataset), you can either provide a single column or a selection of multiple items. To compare groups, provide an additional categorical column in the third parameter. To calculate correlations, provide a metric column in the third parameter and set the metric-parameter to TRUE.

Note: Some column combinations are not implemented yet.

Effect sizes and statistical tests

You can calculate effect sizes and conduct basic statistical tests using effect_counts() and effect_metrics(). Effect calculation is included in the reports if you request it by the effect-parameter, for example:

report_counts(data, adopter, sd_gender, prop="cols", effect=TRUE)

A word of warning: Statistics is the world of uncertainty. All procedures require mindful interpretation. Counting stars might evoke illusions.

Where do all the labels go?

One of the strongest package features is labeling. You know the pain. Labels are stored in the column attributes. Inspect current labels of columns and values by the codebook()-function:

codebook(data)

This results in a table with item names, item values, value names and value labels.

You can set specific column labels by providing a named list to the items-parameter of labs_apply():

data %>%
  labs_apply(
    items = list(
      "cg_adoption_advantage_01" = "Allgemeine Vorteile",
      "cg_adoption_advantage_02" = "Finanzielle Vorteile",
      "cg_adoption_advantage_03" = "Vorteile bei der Arbeit",
      "cg_adoption_advantage_04" = "Macht mehr Spaß"
    )
  ) %>% 
  tab_metrics(starts_with("cg_adoption_advantage_"))

Labels for values inside a column can be adjusted by providing a named list to the values-parameter of labs_apply(). In addition, select the columns where value labels should be changed:


data %>%
  labs_apply(
    cols=starts_with("cg_adoption"),  
    values = list(
      "1" = "Stimme überhaupt nicht zu",
      "2" = "Stimme nicht zu",
      "3" = "Unentschieden",
      "4" = "Stimme zu",
      "5" =  "Stimme voll und ganz zu"
    ) 
  ) %>% 
  plot_metrics(starts_with("cg_adoption"))

To conveniently manage all labels of a dataset, save the result of codebook() to an Excel file, change the labels manually in a copy of the Excel file, and finally call labs_apply() with your revised codebook.


library(readxl)
library(writexl)

# Save codebook to a file
codes <- codebook(data)
write_xlsx(codes,"codebook.xlsx")

# Load and apply a codebook from a file
codes <- read_xlsx("codebook_revised.xlsx")
data <- labs_apply(data, codebook)

Be aware that some data operations such as mutate() from the tidyverse loose labels on their way. In this case, store the labels (in the codebook attribute of the data frame) before the operation and restore them afterwards:

data %>%
  labs_store() %>%
  mutate(sd_age = 2024 - sd_age) %>% 
  labs_restore() %>% 
  
  tab_metrics(sd_age)

SoSci Survey integration

The labeling mechanisms follow a technique used, for example, on SoSci Survey. Sidenote for techies: Labels are stored in the column attributes. That’s why you can directly throw in labeled data from the SoSci Survey API:

library(volker)

# Get your API link from SoSci Survey with settings "Daten als CSV für R abrufen"
eval(parse("https://www.soscisurvey.de/YOURPROJECT/?act=YOURKEY&rScript", encoding="UTF-8"))

# Generate reports
report_counts(ds, A002)

For best results, use sensible prefixes and captions for your SoSci questions. The labels come directly from your questionnaire.

Please note: The values -9, -2, -1 and [NA] nicht beantwortet, [NA] keine Angabe, [no answer] are automatically recoded to missing values within all plot, tab, effect, and report functions. See the clean-parameter help how to disable automatic residual removal.

Customization

You can change plot colors using the theme_vlkr()-function:

theme_set(
  theme_vlkr(
    base_fill = c("#F0983A","#3ABEF0","#95EF39","#E35FF5","#7A9B59"),
    base_gradient = c("#FAE2C4","#F0983A")
  )
)

Plot and table functions share a number of parameters that can be used to customize the outputs. Lookup the available parameters in the help of the specific function.

Data preparation

  • ordered: Sometimes categories have an order, from low to high or from few to many. It helps visual inspections to plot ordered values with shaded colors instead of arbitrary colors. For frequency plots, you can inform the method about the desired order. By default the functions try to automatically detect a sensitive order.
  • category: When you have multiple categories in a column, you can focus one of the categories to simplify the plots and tables. By default, if a column has only TRUE and FALSE values, the outputs focus the TRUE category.
  • clean Before all calculations, the dataset goes through a cleaning plan that, for example, recodes residual factor values such as “[NA] nicht beantwortet” to missings. In surveys, negative values such as -9 or -2 are often used to mark missing values or residual answers (“I don’t know”). See the help for further details or disable data cleaning if you don’t like it. For example, to disable removing the negative residual values, call options(vlkr.na.numbers=FALSE) and options(vlkr.na.levels=FALSE).

Calculations

  • prop: Calculating percentages in a cross tab requires careful selection of the base. You can choose between total, row or column percentages. For stacked bar charts, displaying row percentages instead of total percentages gives a direct visual comparison of groups.
  • ci: Add confidence intervals to plot and table outputs.
  • index: Indexes (=mean of multiple items) can be added to a dataset using idx_add() or, using the index-parameter, automatically be included in report functions. Cronbach’s alpha is added to all table outputs.
  • effect: You are not sure whether the differences are statistical significant? One option is to look out for non overlapping confidence intervals. In addition, the effect option calculates effect sizes such as Cramer’s v or R squared and generates typical statistical tests such as Chi-squared tests and t-tests.
  • method: By default, correlations are calculated using Pearson’s R. You can choose Spearman’s Rho with the methods-parameter.

Labeling

  • title: All plots usually get a title derived from the column attributes or column names. Set to FALSE to suppress the title or provide a title of your choice as a character value.
  • labels: Labels are extracted from the column attributes, if present. Set to FALSE to output bare column names and values.

Tables

  • percent: Frequency tables show percentages by default. Set to FALSE to get raw proportions - easier to postprocess in further calculations.
  • digits: Tables containing means and standard deviations by default round values to one digit. Increase the number to show more digits.
  • values: The more variables you desire, the denser the output must be. Some tables try to serve you insights at the maximum and show two values in one cell, for example the absolute counts (n) and the percentages (p), or the mean (m) and the standard deviation (sd). Control your desire with the values-parameter.

Plots

  • numbers: Bar plots give quick impressions, tables provide exact numbers. In bar charts you can combine both and print the frequencies onto the bars. Set the numbers parameter to “n”, “p” or c(“n”,“p”). To prevent cluttering and overlaps, numbers are only plotted on bars larger than 5%.
  • limits: Do you know how to create misleading graphs? It happens when you truncate the minimum or maximum value in a scale. The scale limits are automatically guessed by the package functions (work in progress). Use the limits-parameter to manually fix any misleading graphs.
  • box: In metric plots you can visualise the distribution by adding boxplots.
  • log: Metric values having long tail distributions are not easy to visualise. In scatter plots, you can use a logarithmic scale. Be aware, that zero values will be omitted because their log value is undefined.

Installation

As with all other packages you’ll have to install the package first.

install.packages("strohne/volker")

You can try alternative versions:

  • If you want, install the main version from GitHub using remotes, which may include features not yet published on CRAN (if asked, skip the updates):

    if (!require(remotes)) { install.packages("remotes") }
    remotes::install_github("strohne/volker", upgrade="never", build_vignettes = TRUE)
  • In case you are adventurous, try the latest experimental development version which lives in the devel branch (if asked, skip the updates):

    if (!require(remotes)) { install.packages("remotes") }
    remotes::install_github("strohne/volker", ref="devel", upgrade="never", build_vignettes = TRUE)

Special features

  • Simple tables, simple plots, simple reports.
  • Labeling and scaling based on attributes. Appropriate attributes, for example, are provided by the SoSci Survey API. Alternatively, you can add custom labels. Use codebook() to see all labels present in a dataset.
  • Interactive reports: Use the volker::html_report template in your Markdown documents to switch between tables and plots when using the report-functions.
  • Calculate metric indexes using idx_add() and effect sizes
    (work in progress)
  • Simplified hints for wrong parameters, e.g. if you forget to provide a data frame (work in progress).
  • Tidyverse style.

Troubleshooting

The kableExtra package produces an error in R 4.3 when knitting documents: .onLoad in loadNamespace() für 'kableExtra' fehlgeschlagen. As a work around, remove PDF and Word settings from the output options in you markdown document (the yml section at the top). Alternatively, install the latest development version:

remotes::install_github("kupietz/kableExtra")

Roadmap

VersionFeaturesStatus
1.0Descriptives80% done
2.0Effects50% done
3.0Factors & clusterswork in progress
4.0Text analysiswork in progress

Similar packages

The volker package is inspired by outputs used in the the textbook Einfache Datenauswertung mit R (Gehrau & Maubach et al., 2022), which provides an introduction to univariate and bivariate statistics and data representation using RStudio and R Markdown.

Other packages with high-level reporting functions:

Authors and citation

Authors
Jakob Jünger (University of Münster)
Henrieke Kotthoff (University of Münster)

Contributers
Chantal Gärtner (University of Münster)

Citation
Jünger, J. & Kotthoff, H. (2024). volker: High-level functions for tabulating, charting and reporting survey data. R package version 2.1.

Copy Link

Version

Install

install.packages('volker')

Monthly Downloads

191

Version

2.1.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Jakob Jünger

Last Published

September 10th, 2024

Functions in volker (2.1.0)

data_clean

Prepare dataframe for the analysis
check_is_param

Check whether a parameter value is from a valid set
.attr_insert

Insert a name-value-pair into an object attribute
.knit_plot

Knit volker plots
.iqr

Calculate IQR
.to_vlkr_rprt

Add the vlkr_rprt class to an object
.whisker_upper

Calculate upper whisker in a boxplot
effect_counts_items_cor

Correlate the values in multiple items with one metric column and output effect sizes and tests
.effect_npmi

Calculate nmpi
data_clean_sosci

Prepare data originating from SoSci Survey
.outliers

Calculate outliers
data_rm_zeros

Remove zero values, drop missings and output a message
.plot_lines

Helper function: plot grouped line chart
.plot_cor

Helper function: plot cor and regression outputs
data_rm_negatives

Remove negatives and output a warning
effect_counts_items_cor_items

Correlate the values in multiple items with multiple metric columns and output effect sizes and tests
.to_vlkr_tab

Add vlkr_tbl class
VLKR_WRAP_SEPARATOR

Word wrap separators
VLKR_POINT_SIZE

Sizes
.effect_correlations

Test whether correlations are different from zero
codebook

Get variable labels from their comment attributes
effect_counts_items_grouped

Effect size and test for comparing multiple variables by a grouping variable
get_gini

Calculate the Gini coefficient
get_title

Get a common title for a column selection
ends_with

Select variables by their postfix
.plot_bars

Helper function: plot grouped bar chart
data_rm_na_levels

Remove NA levels
.whisker_lower

Calculate lower whisker in a boxplot
effect_metrics_one_cor

Test whether the correlation is different from zero
effect_metrics_one_grouped

Output a regression table with estimates and macro statistics
effect_metrics_items_cor

Output correlation coefficients for items and one metric variable
effect_metrics_items

Test whether a distribution is normal for each item
.report_idx

Generate an index table and plot
filter

Filter function
get_limits

Get the numeric range from the labels
.plot_summary

Helper function: plot grouped line chart by summarising values
knit_print.vlkr_plt

Printing method for volker plots when knitting
html_report

Volker style HTML document format
data_rm_missings

Remove missings and output a message
plot_metrics_items_grouped

Output averages for multiple variables compared by a grouping variable
.knit_prepare

Prepare markdown content for table rendering
effect_counts_items_grouped_items

Effect size and test for comparing multiple variables by multiple grouping variables
.tab_split

Split a metric column into categorical based on median
.knit_table

Knit volker tables
data_rm_na_numbers

Remove NA numbers
data_prepare

Prepare data for calculation
get_baseline

Get a formatted baseline for removed zero, negative, and missing cases and include focus category information if present
get_angle

Angle labels
effect_metrics_items_cor_items

Output correlation coefficients for multiple items
print.vlkr_list

Printing method for volker lists
.to_vlkr_df

Add vlkr_df class - that means, the data frame has been prepared
effect_counts_one_cor

Output test statistics and effect size from a logistic regression of one metric predictor
effect_metrics_one

Test whether a distribution is normal
plot_metrics_items_grouped_items

Correlation of metric items with categorical items
pdf_report

Volker style PDF document format
effect_metrics_items_grouped

Compare groups for each item by calculating F-statistics and effect sizes
mutate

Mutate function
labs_replace

Replace item value names in a column by their labels
effect_metrics_items_grouped_items

Compare groups for each item with multiple target items by calculating F-statistics and effect sizes
labs_impute

Add missing residual labels in numeric columns that have at least one labeled value
effect_counts_one

Test homogeneity of category shares
plot_counts_items

Output frequencies for multiple variables
print.vlkr_plt

Printing method for volker plots
label_scale

Wrap labels in plot scales
get_ci

Calculate ci values to be used for error bars on a plot
.factor_with_attr

Create a factor vector and preserve all attributes
tab_counts

Output a frequency table
.get_fig_settings

Get plot size and resolution for the current output format from the config
get_prefix

Get the common prefix of character values
get_stars

Get significance stars from p values
plot_counts_items_cor

Plot percent shares of multiple items compared by a metric variable split into groups
plot_counts_items_grouped_items

Correlation of categorical items with categorical items
print.vlkr_tbl

Printing method for volker tables.
print.vlkr_rprt

Printing method for volker reports
tab_counts_items_grouped

Compare the values in multiple items by a grouping column
plot_counts_one

Plot the frequency of values in one column
.to_vlkr_list

Add vlkr_list class
idx_add

Calculate the mean value of multiple items
plot_metrics_one_grouped

Output averages for multiple variables
tab_counts_one_cor

Count values by a metric column that will be split into groups
get_direction

Detect whether a scale is a numeric sequence
tab_counts_items_grouped_items

Correlation of categorical items with categorical items
plot_counts_one_cor

Plot frequencies cross tabulated with a metric column that will be split into groups
plot_counts_one_grouped

Plot frequencies cross tabulated with a grouping column
tab_counts_one

Output a frequency table for the values in one column
select

Select function
idx_alpha

Get number of items and Cronbach's alpha of a scale added by idx_add()
plot_counts_items_cor_items

Correlation of categorical items with metric items
plot_metrics_one_cor

Correlate two items
plot_metrics_one

Output a density plot for a single metric variable
theme_set

Get, set, and modify the active ggplot theme
plot_counts_items_grouped

Plot percent shares of multiple items compared by groups
theme_vlkr

Define a default theme for volker plots
skim_boxplot

A skimmer for boxplot generation
skim_metrics

A reduced skimmer for metric variables Returns a five point summary, mean and sd, items count and alpha for scales added by idx_add()
labs_apply

Set column and value labels
tab_counts_items

Output frequencies for multiple variables
.to_vlkr_plot

Add the volker class and options
effect_counts

Output effect sizes and test statistics for count data
starts_with

Select variables by their prefix
prepare_scale

Prepare the scale attribute values
effect_counts_items

Test homogeneity of category shares for multiple items
plot_counts

Output a frequency plot
plot_metrics

Output a plot with distribution parameters such as the mean values
effect_metrics

Output effect sizes and test statistics for metric data
tab_metrics_items_cor_items

Output a correlation table for item battery and item battery
tab_metrics

Output a table with distribution parameters
labs_clear

Remove all comments from the selected columns
plot_metrics_items

Output averages for multiple variables
tibble

Tidy tibbles
tab_metrics_items_grouped_items

Correlation of metric items with categorical items
%>%

Pipe operator
vlkr_colors_sequential

Get colors for sequential scales
tab_counts_one_grouped

Output frequencies cross tabulated with a grouping column
effect_counts_one_grouped

Output test statistics and effect size for contingency tables
tidy_lm_levels

Tidy lm results, replace categorical parameter names by their levels and add the reference level
tab_metrics_one

Output a five point summary table for the values in multiple columns
volker-package

volker: High-Level Functions for Tabulating, Charting and Reporting Survey Data
tab_metrics_items

Output a five point summary table for multiple items
labs_restore

Restore labels from the codebook store in the codebook attribute.
labs_store

Get the current codebook and store it in the codebook attribute.
report_metrics

Create table and plot for metric variables
report_counts

Create table and plot for categorical variables
plot_metrics_items_cor

Multiple items correlated with one metric variable
plot_metrics_items_cor_items

Heatmap for correlations between multiple items
tab_metrics_items_cor

Output a correlation table for item battery and one metric variable
tab_counts_items_cor

Compare the values in multiple items by a metric column that will be split into groups
trim_prefix

Remove a prefix from a character vector
tab_counts_items_cor_items

Correlation of categorical items with metric items
trim_label

Remove trailing zeros and trailing or leading whitespaces, colons, hyphens and underscores
tab_metrics_one_cor

Correlate two columns
tab_metrics_items_grouped

Output the means for groups in one or multiple columns
tribble

Tidy tribbles
vlkr_colors_discrete

Get colors for discrete scales
zip_tables

Combine two identically shaped data frames by adding values of each column from the second data frame into the corresponding column in the first dataframe using parentheses
vlkr_colors_polarized

Get colors for polarized scales
trunc_labels

Truncate labels
tab_metrics_one_grouped

Output a five point summary for groups
wrap_label

Wrap a string
VLKR_FIG_SETTINGS

Resolution settings for plots
VLKR_POINT_ALPHA

Alpha values
.density_mode

Get the maximum density value in a density plot
VLKR_FILLDISCRETE

Fill colors
VLKR_FILLGRADIENT

Gradient colors
VLKR_NA_NUMBERS

Numbers to remove from vectors
VLKR_PLOT_LABELWRAP

Wrapping threshold
VLKR_NA_LEVELS

Levels to remove from factors
VLKR_FILLPOLARIZED

Polarized colors
.attr_transfer

Transfer an attribute from one to another object
.add_to_vlkr_rprt

Add an object to the report list
VLKR_POINT_MEAN_SHAPE

Shapes
VLKR_NORMAL_DIGITS

Output thresholds
check_has_column

Check whether a column exist and stop if not
check_is_dataframe

Check whether the object is a dataframe
cfg_get_na_numbers

Get configured na numbers
chatgpt

ChatGPT Adoption Dataset CG-GE-APR23