Assesses and summarizes the content and structure of a dataset and generates reports of the results. This function can be used to evaluate data structure, presence of specific fields, coherence across elements, and data dictionary formats, and to summarize additional information about variable distributions and descriptive statistics.

dataset_summarize(
  dataset,
  data_dict = data_dict_extract(dataset),
  group_by = group_vars(dataset),
  taxonomy = NULL,
  valueType_guess = TRUE,
  dataset_name = NULL
)

Arguments

dataset

A dataset object.

data_dict

A list of data frame(s) representing metadata of the input dataset. Automatically generated if not provided.

group_by

A character string identifying the column in the dataset to use as a grouping variable. Elements will be grouped by this column.

taxonomy

An optional data frame identifying a variable classification schema.

valueType_guess

Whether the output should include a more accurate valueType that could be applied to the dataset. TRUE by default.

dataset_name

A character string specifying the name of the dataset (internally used in the function dossier_evaluate()).

Value

A list of data frames containing assessment reports and summaries.

Details

A data dictionary contains the list of variables in a dataset and metadata about the variables and can be associated with a dataset. A data dictionary object is a list of data frame(s) named 'Variables' (required) and 'Categories' (if any). To be usable in any function, the data frame 'Variables' must contain at least the name column, with all unique and non-missing entries, and the data frame 'Categories' must contain at least the variable and name columns, with unique combination of variable and name. The function truncates each cell to a maximum of 10000 characters, to be readable and compatible with Excel.

A dataset is a data table containing variables. A dataset object is a data frame and can be associated with a data dictionary. If no data dictionary is provided with a dataset, a minimum workable data dictionary will be generated as needed within relevant functions. Identifier variable(s) for indexing can be specified by the user. The id values must be non-missing and will be used in functions that require it. If no identifier variable is specified, indexing is handled automatically by the function.

A taxonomy is a classification schema that can be defined for variable attributes. A taxonomy is usually extracted from an Opal environment, and a taxonomy object is a data frame that must contain at least the columns taxonomy, vocabulary, and terms. Additional details about Opal taxonomies are available online.

The valueType is a declared property of a variable that is required in certain functions to determine handling of the variables. Specifically, valueType refers to the OBiBa data type of a variable. The valueType is specified in a data dictionary in a column 'valueType' and can be associated with variables as attributes. Acceptable valueTypes include 'text', 'integer', 'decimal', 'boolean', datetime', 'date'. The full list of OBiBa valueType possibilities and their correspondence with R data types are available using valueType_list. The valueType can be used to coerce the variable to the corresponding data type.

Examples

# \donttest{ 

library(dplyr)


###### Example 1: use madshapR_examples provided by the package
dataset <- as_dataset(madshapR_examples$`dataset_example`, col_id = 'part_id')
data_dict <- as_data_dict_mlstr(madshapR_examples$`data_dictionary_example`)

summary_dataset <- dataset_summarize(dataset, data_dict,group_by = "gndr")
#> - DATA DICTIONARY ASSESSMENT: data_dict --------------
#>     Assess the standard adequacy of naming
#>     Assess the uniqueness and presence of variable names
#>     Assess the presence of possible duplicated columns
#>     Assess the presence of duplicated rows
#>     Assess the presence of empty rows in the data dictionary
#>     Assess the presence of empty column in the data dictionary
#>     Assess the presence of categories not in the data dictionary
#>     Assess the `valueType` column in 'Variables'
#>     Assess the completion of `label:en` column in 'Variables'
#>     Assess presence and completion of `label:en` column in 'Categories'
#>     Assess the logical values of missing column in Categories
#>     Generate report
#> 
#>     The data dictionary contains no errors/warnings.
#> 
#>   - WARNING MESSAGES (if any): --------------------------------------------
#> 
#> - DATASET ASSESSMENT: dataset --------------------------
#>     Assess the standard adequacy of naming
#>     Assess the presence of variable names both in dataset and data dictionary
#>     Assess the presence of possible duplicated variable in the dataset
#>     Assess the presence of possible duplicated participants
#>     Assess the presence of unique value columns in dataset
#>     Assess the presence of empty rows in the dataset
#>     Assess the presence all empty variable in the dataset
#>     Assess the Categories comparison in dataset and data dictionary
#>     Assess the `valueType` comparison in dataset and data dictionary
#>     Generate report
#> 
#>   - WARNING MESSAGES (if any): -------------------------------------------------
#>     
#> - DATASET SUMMARIZE: dataset --------------------------
#>     Summarize the data type of each variable across the dataset
#>     Summarize information for all variables
#>     Summarize information for numerical variables
#>     Summarize information for text variables
#>     Summarize information for date variables
#>     Summarize information for categorical variables
#>     Summarize global information (Overview)
#>     Generate report
glimpse(summary_dataset)
#> List of 7
#>  $ Overview                    : tibble [15 × 5] (S3: tbl_df/tbl/data.frame)
#>   ..$ Overview                  : chr [1:15] "Date report generated" "Name of the dataset" "    Identifier variable" "    Grouping variable" ...
#>   ..$ (all)                     : chr [1:15] "2025-06-26" "dataset" "part_id" "gndr" ...
#>   ..$ [1] Male                  : chr [1:15] " " " " " " " " ...
#>   ..$ [2] Female                : chr [1:15] " " " " " " " " ...
#>   ..$ [-77] Don’t want to answer: chr [1:15] " " " " " " " " ...
#>  $ Variables summary (all)     : tibble [25 × 19] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:25] "1" "1" "1" "2" ...
#>   ..$ Grouping variable: gndr      : chr [1:25] "[1] Male" "[2] Female" "[-77] Don’t want to answer" "(all)" ...
#>   ..$ Variable name                : chr [1:25] "part_id" "part_id" "part_id" "gndr" ...
#>   ..$ Variable label               : chr [1:25] "id of the participant" "id of the participant" "id of the participant" "gndr" ...
#>   ..$ Quality assessment comment   : chr [1:25] "[INFO] - Identifier variable." "[INFO] - Identifier variable." "[INFO] - Identifier variable." "[INFO] - Grouping variable." ...
#>   ..$ Data dictionary valueType    : chr [1:25] "text" "text" "text" "integer" ...
#>   ..$ Dataset valueType            : chr [1:25] "text" "text" "text" "decimal" ...
#>   ..$ Suggested valueType          : chr [1:25] NA NA NA "integer" ...
#>   ..$ Categorical variable         : chr [1:25] "no" "no" "no" "yes" ...
#>   ..$ Categories in data dictionary: chr [1:25] NA NA NA "[1] Male\n[2] Female\n[-77] Don’t want to answer" ...
#>   ..$ Non-valid categories         : chr [1:25] NA NA NA "\n\n[-77] Don’t want to answer" ...
#>   ..$ Number of rows               : chr [1:25] "22" "23" "5" "50" ...
#>   ..$ Number of valid values       : chr [1:25] "22" "23" "5" "50" ...
#>   ..$ Number of non-valid values   : chr [1:25] "0" "0" "0" "0" ...
#>   ..$ Number of empty values       : chr [1:25] "0" "0" "0" "0" ...
#>   ..$ % Valid values               : chr [1:25] "100" "100" "100" "100" ...
#>   ..$ % Non-valid values           : chr [1:25] "0" "0" "0" "0" ...
#>   ..$ % Empty values               : chr [1:25] "0" "0" "0" "0" ...
#>   ..$ Number of distinct values    : chr [1:25] "22" "23" "5" "3" ...
#>  $ Text variable summary       : tibble [3 × 19] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:3] "9" "9" "9"
#>   ..$ Grouping variable: gndr      : chr [1:3] "[1] Male" "[2] Female" "[-77] Don’t want to answer"
#>   ..$ Variable name                : chr [1:3] "opentext" "opentext" "opentext"
#>   ..$ Variable label               : chr [1:3] "opentext" "opentext" "opentext"
#>   ..$ Quality assessment comment   : chr [1:3] NA NA NA
#>   ..$ Data dictionary valueType    : chr [1:3] "text" "text" "text"
#>   ..$ Categorical variable         : chr [1:3] "no" "no" "no"
#>   ..$ Categories in data dictionary: chr [1:3] NA NA NA
#>   ..$ Non-valid categories         : chr [1:3] NA NA NA
#>   ..$ Number of rows               : chr [1:3] "22" "23" "5"
#>   ..$ Number of valid values       : chr [1:3] "22" "23" "5"
#>   ..$ Number of non-valid values   : chr [1:3] "0" "0" "0"
#>   ..$ Number of empty values       : chr [1:3] "0" "0" "0"
#>   ..$ % Valid values               : chr [1:3] "100" "100" "100"
#>   ..$ % Non-valid values           : chr [1:3] "0" "0" "0"
#>   ..$ % Empty values               : chr [1:3] "0" "0" "0"
#>   ..$ Number of distinct values    : chr [1:3] "9" "9" "4"
#>   ..$ Most common values           : chr [1:3] "" "" ""
#>   ..$ Least common values          : chr [1:3] "beginning of the end. ; rather delightful, for Mrs.... ; that she must grow up. You ..." "beginning of the end. ; cried, Oh, why can't you re..." "beginning of the end. ; rather delightful, for Mrs.... ; that passed between them on..."
#>  $ Numerical variable summary  : tibble [12 × 24] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:12] "3" "3" "3" "4" ...
#>   ..$ Grouping variable: gndr      : chr [1:12] "[1] Male" "[2] Female" "[-77] Don’t want to answer" "[1] Male" ...
#>   ..$ Variable name                : chr [1:12] "height" "height" "height" "weight_ms" ...
#>   ..$ Variable label               : chr [1:12] "height" "height" "height" "weight_ms" ...
#>   ..$ Quality assessment comment   : chr [1:12] NA NA NA NA ...
#>   ..$ Data dictionary valueType    : chr [1:12] "integer" "integer" "integer" "integer" ...
#>   ..$ Categorical variable         : chr [1:12] "no" "no" "no" "mix" ...
#>   ..$ Categories in data dictionary: chr [1:12] NA NA NA "[-99] Don’t know\n[-88] Don’t want to answer" ...
#>   ..$ Non-valid categories         : chr [1:12] NA NA NA "[-99] Don’t know\n[-88] Don’t want to answer" ...
#>   ..$ Number of rows               : chr [1:12] "22" "23" "5" "22" ...
#>   ..$ Number of valid values       : chr [1:12] "22" "23" "5" "9" ...
#>   ..$ Number of non-valid values   : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ Number of empty values       : chr [1:12] "0" "0" "0" "13" ...
#>   ..$ % Valid values               : chr [1:12] "100" "100" "100" "40.91" ...
#>   ..$ % Non-valid values           : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ % Empty values               : chr [1:12] "0" "0" "0" "59.09" ...
#>   ..$ Number of distinct values    : chr [1:12] "19" "15" "4" "7" ...
#>   ..$ Minimum                      : chr [1:12] "149" "151" "169" "47" ...
#>   ..$ 1st quartile                 : chr [1:12] "159.5" "166.5" "171" "59" ...
#>   ..$ Median                       : chr [1:12] "170.5" "175" "171" "59" ...
#>   ..$ 3rd quartile                 : chr [1:12] "186.5" "181" "180" "65" ...
#>   ..$ Maximum                      : chr [1:12] "196" "196" "197" "95" ...
#>   ..$ Mean                         : chr [1:12] "171.18" "172.74" "177.6" "64.78" ...
#>   ..$ Standard deviation           : chr [1:12] "14.92" "12.56" "11.65" "15.27" ...
#>  $ Date variable summary       : tibble [3 × 26] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:3] "6" "6" "6"
#>   ..$ Grouping variable: gndr      : chr [1:3] "[1] Male" "[2] Female" "[-77] Don’t want to answer"
#>   ..$ Variable name                : chr [1:3] "dob" "dob" "dob"
#>   ..$ Variable label               : chr [1:3] "dob" "dob" "dob"
#>   ..$ Quality assessment comment   : chr [1:3] NA NA "[INFO] - All rows are unique."
#>   ..$ Data dictionary valueType    : chr [1:3] "date" "date" "date"
#>   ..$ Categorical variable         : chr [1:3] "no" "no" "no"
#>   ..$ Categories in data dictionary: chr [1:3] NA NA NA
#>   ..$ Non-valid categories         : chr [1:3] NA NA NA
#>   ..$ Number of rows               : chr [1:3] "22" "23" "5"
#>   ..$ Number of valid values       : chr [1:3] "21" "22" "5"
#>   ..$ Number of non-valid values   : chr [1:3] "0" "0" "0"
#>   ..$ Number of empty values       : chr [1:3] "1" "1" "0"
#>   ..$ % Valid values               : chr [1:3] "95.45" "95.65" "100"
#>   ..$ % Non-valid values           : chr [1:3] "0" "0" "0"
#>   ..$ % Empty values               : chr [1:3] "4.55" "4.35" "0"
#>   ..$ Number of distinct values    : chr [1:3] "21" "19" "5"
#>   ..$ Oldest date                  : Date[1:3], format: "1960-09-22" "1962-06-14" ...
#>   ..$ Most recent date             : Date[1:3], format: "2002-10-13" "2001-08-15" ...
#>   ..$ Minimum (year)               : chr [1:3] "1960" "1962" "1961"
#>   ..$ 1st quartile (year)          : chr [1:3] "1967" "1969" "1964"
#>   ..$ Median (year)                : chr [1:3] "1976" "1986" "1976"
#>   ..$ 3rd quartile (year)          : chr [1:3] "1993" "1994" "1981"
#>   ..$ Maximum (year)               : chr [1:3] "2002" "2001" "1991"
#>   ..$ Mean (year)                  : chr [1:3] "1980" "1982" "1975"
#>   ..$ Span (year)                  : chr [1:3] "42" "39" "30"
#>  $ Categorical variable summary: tibble [7 × 20] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                                            : chr [1:7] "2" "4" "4" "4" ...
#>   ..$ Grouping variable: gndr                          : chr [1:7] "(all)" "[1] Male" "[2] Female" "[-77] Don’t want to answer" ...
#>   ..$ Variable name                                    : chr [1:7] "gndr" "weight_ms" "weight_ms" "weight_ms" ...
#>   ..$ Variable label                                   : chr [1:7] "gndr" "weight_ms" "weight_ms" "weight_ms" ...
#>   ..$ Quality assessment comment                       : chr [1:7] "[INFO] - Grouping variable." NA NA NA ...
#>   ..$ Data dictionary valueType                        : chr [1:7] "integer" "integer" "integer" "integer" ...
#>   ..$ Categorical variable                             : chr [1:7] "yes" "mix" "mix" "mix" ...
#>   ..$ Categories in data dictionary                    : chr [1:7] "[1] Male\n[2] Female\n[-77] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" ...
#>   ..$ Non-valid categories                             : chr [1:7] "\n\n[-77] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" "[-99] Don’t know\n[-88] Don’t want to answer" ...
#>   ..$ Number of rows                                   : chr [1:7] "50" "22" "23" "5" ...
#>   ..$ Number of valid values                           : chr [1:7] "50" "9" "8" "4" ...
#>   ..$ Number of non-valid values                       : chr [1:7] "0" "0" "2" "0" ...
#>   ..$ Number of empty values                           : chr [1:7] "0" "13" "13" "1" ...
#>   ..$ % Valid values                                   : chr [1:7] "100" "40.91" "34.78" "80" ...
#>   ..$ % Non-valid values                               : chr [1:7] "0" "0" "8.7" "0" ...
#>   ..$ % Empty values                                   : chr [1:7] "0" "59.09" "56.52" "20" ...
#>   ..$ Number of distinct values                        : chr [1:7] "3" "7" "7" "4" ...
#>   ..$ Values present in dataset                        : chr [1:7] "Valid values : \n[-77] Don’t want to answer : 10%\nValid values : \n[1] Male : 44%\n[2] Female : 46%\n" "Other values (non-categorical) : 40.91%\n\nNon-valid values : \n[-99] Don’t know : 0%\n[-88] Don’t want to answ"| __truncated__ "Other values (non-categorical) : 34.78%\n\nNon-valid values : \n[-99] Don’t know : 0%\n[-88] Don’t want to answ"| __truncated__ "Other values (non-categorical) : 80%\n\nNon-valid values : \n[-99] Don’t know : 0%\n[-88] Don’t want to answer "| __truncated__ ...
#>   ..$ Data dictionary categories not present in dataset: chr [1:7] NA "[-99] Don’t know\n[-88] Don’t want to answer\n" "[-99] Don’t know\n" "[-99] Don’t know\n[-88] Don’t want to answer\n" ...
#>   ..$ Dataset values not present in data dictionary    : chr [1:7] NA "47 ; 52 ; 59 ; 63 ; 65 [...]\n\n" "43 ; 54 ; 62 ; 65 ; 67 [...]\n\n" "25 ; 52 ; 54 ; 57\n\n" ...
#>  $ Dataset assessment          : tibble [11 × 5] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index              : chr [1:11] "2" "2" "3" "4" ...
#>   ..$ Variable name      : chr [1:11] "gndr" "gndr" "height" "weight_ms" ...
#>   ..$ Dataset assessment : chr [1:11] "[INFO] - Grouping variable is not defined as categorical in data dictionary." "[INFO] - Suggested valueType." "[INFO] - Suggested valueType." "[INFO] - Variable is defined as categorical in data dictionary but not in dataset." ...
#>   ..$ Value              : chr [1:11] "1 ; 2 ; -77" "decimal" "decimal" "-99 ; -88" ...
#>   ..$ Suggested valueType: chr [1:11] NA "integer" "integer" NA ...
#>  - attr(*, "madshapR_group::group_by")= chr "gndr"

###### Example 2: Any data frame can be a dataset by definition
summary_iris <- dataset_summarize(iris, group_by = "Species")
#> - DATA DICTIONARY ASSESSMENT: data_dict --------------
#>     Assess the standard adequacy of naming
#>     Assess the uniqueness and presence of variable names
#>     Assess the presence of possible duplicated columns
#>     Assess the presence of duplicated rows
#>     Assess the presence of empty rows in the data dictionary
#>     Assess the presence of empty column in the data dictionary
#>     Assess the presence of categories not in the data dictionary
#>     Assess the `valueType` column in 'Variables'
#>     Assess the completion of `label` column in 'Variables'
#>     Assess presence and completion of `label` column in 'Categories'
#>     Assess the logical values of missing column in Categories
#>     Generate report
#> 
#>     The data dictionary contains no errors/warnings.
#> 
#>   - WARNING MESSAGES (if any): --------------------------------------------
#> 
#> - DATASET ASSESSMENT: iris --------------------------
#>     Assess the standard adequacy of naming
#>     Assess the presence of variable names both in dataset and data dictionary
#>     Assess the presence of possible duplicated variable in the dataset
#>     Assess the presence of possible duplicated participants
#>     Assess the presence of unique value columns in dataset
#>     Assess the presence of empty rows in the dataset
#>     Assess the presence all empty variable in the dataset
#>     Assess the Categories comparison in dataset and data dictionary
#>     Assess the `valueType` comparison in dataset and data dictionary
#>     Generate report
#> 
#>   - WARNING MESSAGES (if any): -------------------------------------------------
#>     
#> - DATASET SUMMARIZE: iris --------------------------
#>     Summarize the data type of each variable across the dataset
#>     Summarize information for all variables
#>     Summarize information for numerical variables
#>     Summarize information for categorical variables
#>     Summarize global information (Overview)
#>     Generate report
glimpse(summary_iris)
#> List of 5
#>  $ Overview                    : tibble [13 × 5] (S3: tbl_df/tbl/data.frame)
#>   ..$ Overview    : chr [1:13] "Date report generated" "Name of the dataset" "    Identifier variable" "    Grouping variable" ...
#>   ..$ (all)       : chr [1:13] "2025-06-26" "iris" " " "Species" ...
#>   ..$ [setosa]    : chr [1:13] " " " " " " " " ...
#>   ..$ [versicolor]: chr [1:13] " " " " " " " " ...
#>   ..$ [virginica] : chr [1:13] " " " " " " " " ...
#>  $ Variables summary (all)     : tibble [13 × 19] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:13] "1" "1" "1" "2" ...
#>   ..$ Grouping variable: Species   : chr [1:13] "[setosa]" "[versicolor]" "[virginica]" "[setosa]" ...
#>   ..$ Variable name                : chr [1:13] "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Width" ...
#>   ..$ Variable label               : chr [1:13] "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Width" ...
#>   ..$ Quality assessment comment   : chr [1:13] NA NA NA NA ...
#>   ..$ Data dictionary valueType    : chr [1:13] "decimal" "decimal" "decimal" "decimal" ...
#>   ..$ Dataset valueType            : chr [1:13] "decimal" "decimal" "decimal" "decimal" ...
#>   ..$ Suggested valueType          : chr [1:13] NA NA NA NA ...
#>   ..$ Categorical variable         : chr [1:13] "no" "no" "no" "no" ...
#>   ..$ Categories in data dictionary: chr [1:13] NA NA NA NA ...
#>   ..$ Non-valid categories         : chr [1:13] NA NA NA NA ...
#>   ..$ Number of rows               : chr [1:13] "50" "50" "50" "50" ...
#>   ..$ Number of valid values       : chr [1:13] "50" "50" "50" "50" ...
#>   ..$ Number of non-valid values   : chr [1:13] "0" "0" "0" "0" ...
#>   ..$ Number of empty values       : chr [1:13] "0" "0" "0" "0" ...
#>   ..$ % Valid values               : chr [1:13] "100" "100" "100" "100" ...
#>   ..$ % Non-valid values           : chr [1:13] "0" "0" "0" "0" ...
#>   ..$ % Empty values               : chr [1:13] "0" "0" "0" "0" ...
#>   ..$ Number of distinct values    : chr [1:13] "15" "21" "21" "16" ...
#>  $ Numerical variable summary  : tibble [12 × 24] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                        : chr [1:12] "1" "1" "1" "2" ...
#>   ..$ Grouping variable: Species   : chr [1:12] "[setosa]" "[versicolor]" "[virginica]" "[setosa]" ...
#>   ..$ Variable name                : chr [1:12] "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Width" ...
#>   ..$ Variable label               : chr [1:12] "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Width" ...
#>   ..$ Quality assessment comment   : chr [1:12] NA NA NA NA ...
#>   ..$ Data dictionary valueType    : chr [1:12] "decimal" "decimal" "decimal" "decimal" ...
#>   ..$ Categorical variable         : chr [1:12] "no" "no" "no" "no" ...
#>   ..$ Categories in data dictionary: chr [1:12] NA NA NA NA ...
#>   ..$ Non-valid categories         : chr [1:12] NA NA NA NA ...
#>   ..$ Number of rows               : chr [1:12] "50" "50" "50" "50" ...
#>   ..$ Number of valid values       : chr [1:12] "50" "50" "50" "50" ...
#>   ..$ Number of non-valid values   : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ Number of empty values       : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ % Valid values               : chr [1:12] "100" "100" "100" "100" ...
#>   ..$ % Non-valid values           : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ % Empty values               : chr [1:12] "0" "0" "0" "0" ...
#>   ..$ Number of distinct values    : chr [1:12] "15" "21" "21" "16" ...
#>   ..$ Minimum                      : chr [1:12] "4.3" "4.9" "4.9" "2.3" ...
#>   ..$ 1st quartile                 : chr [1:12] "4.8" "5.6" "6.23" "3.2" ...
#>   ..$ Median                       : chr [1:12] "5" "5.9" "6.5" "3.4" ...
#>   ..$ 3rd quartile                 : chr [1:12] "5.2" "6.3" "6.9" "3.68" ...
#>   ..$ Maximum                      : chr [1:12] "5.8" "7" "7.9" "4.4" ...
#>   ..$ Mean                         : chr [1:12] "5.01" "5.94" "6.59" "3.43" ...
#>   ..$ Standard deviation           : chr [1:12] "0.35" "0.52" "0.64" "0.38" ...
#>  $ Categorical variable summary: tibble [1 × 20] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index                                            : chr "5"
#>   ..$ Grouping variable: Species                       : chr "(all)"
#>   ..$ Variable name                                    : chr "Species"
#>   ..$ Variable label                                   : chr "Species"
#>   ..$ Quality assessment comment                       : chr "[INFO] - Grouping variable."
#>   ..$ Data dictionary valueType                        : chr "text"
#>   ..$ Categorical variable                             : chr "yes"
#>   ..$ Categories in data dictionary                    : chr "[setosa]\n[versicolor]\n[virginica]"
#>   ..$ Non-valid categories                             : chr NA
#>   ..$ Number of rows                                   : chr "150"
#>   ..$ Number of valid values                           : chr "150"
#>   ..$ Number of non-valid values                       : chr "0"
#>   ..$ Number of empty values                           : chr "0"
#>   ..$ % Valid values                                   : chr "100"
#>   ..$ % Non-valid values                               : chr "0"
#>   ..$ % Empty values                                   : chr "0"
#>   ..$ Number of distinct values                        : chr "3"
#>   ..$ Values present in dataset                        : chr "Valid values : \n[setosa] : 33.33%\n[versicolor] : 33.33%\n[virginica] : 33.33%\n"
#>   ..$ Data dictionary categories not present in dataset: chr NA
#>   ..$ Dataset values not present in data dictionary    : chr NA
#>  $ Dataset assessment          : tibble [1 × 4] (S3: tbl_df/tbl/data.frame)
#>   ..$ Index             : chr NA
#>   ..$ Variable name     : chr "(all)"
#>   ..$ Dataset assessment: chr "[INFO] - Duplicated rows."
#>   ..$ Value             : chr "102 ; 143"
#>  - attr(*, "madshapR_group::group_by")= chr "Species"
 
# }