├── .Rbuildignore ├── .gitignore ├── DESCRIPTION ├── DESIGN.md ├── LICENSE ├── NAMESPACE ├── NEWS.md ├── R ├── archive │ ├── na_explicit.R │ └── na_replace.r ├── data.R ├── drop_cols.R ├── drop_rows.R ├── impute.R ├── impute_funs.R ├── make_impute.R ├── na_predict.R ├── utils.R └── zzz.R ├── README.md ├── TODO.md ├── data ├── nacars.rda ├── nacars_dt.rda ├── nairis.rda └── nairis_dt.rda ├── inst └── extdata │ └── nacars.R ├── man ├── assign_these.Rd ├── drop_cols.Rd ├── drop_rows.Rd ├── figures │ ├── hexagon_blue_tidyimpute_v1.0.png │ └── hexagon_blue_tidyimpute_v1.0.svg ├── impute.Rd ├── impute_functions.Rd ├── make_impute.Rd ├── na_predict.Rd ├── nacars.Rd └── ns_export.Rd ├── tests ├── testthat.R └── testthat │ ├── test-impute.R.off │ ├── test-impute_.R │ ├── test-impute_max.R │ ├── test-impute_mean.R │ ├── test-impute_median.R │ ├── test-impute_mode.R │ └── test-impute_zero.R └── tidyimpute.Rproj /.Rbuildignore: -------------------------------------------------------------------------------- 1 | 2 | .git.orig 3 | 4 | ^.*\.Rproj$ 5 | ^\.Rproj\.user$ 6 | ^docs$ 7 | 8 | DESIGN.md 9 | TODO.md 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .git.orig 2 | 3 | # History files 4 | .Rhistory 5 | # Example code in package build process 6 | *-Ex.R 7 | # R data files from past sessions 8 | .Rdata 9 | .Rproj.user 10 | .RData 11 | src/zoo 12 | inst/doc 13 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: tidyimpute 2 | Title: Impute the Tidyverse Way 3 | Version: 0.2.0 4 | Date: 2018-03-30 5 | Authors@R: c( 6 | person("Christopher", "Brown", , "chris.brown@decisionpatterns.com", c("aut", "cre") ), 7 | person("Decision Patterns", role = "cph") 8 | ) 9 | URL: https://github.com/decisionpatterns/tidyimpute 10 | Description: 11 | Functions and methods for imputing missing values (NA) in tables and list 12 | patterned after the tidyverse approach of 'dplyr' and 'rlang'; works with 13 | data.tables as well. 14 | BugReports: https://github.com/decisionpatterns/tidyimpute/issues 15 | Depends: 16 | R (>= 3.1.0) 17 | Imports: 18 | methods, 19 | dplyr (>= 0.7.2), 20 | rlang (>= 0.1.2), 21 | na.tools (>= 0.1.0) 22 | Suggests: 23 | testthat (>= 1.0.2), 24 | data.table (>= 1.10), 25 | catcont (>= 0.5.0), 26 | magrittr 27 | License: GPL-3 | file LICENSE 28 | LazyData: true 29 | RoxygenNote: 6.0.1.9000 30 | Roxygen: list(markdown = TRUE) 31 | Repository: CRAN 32 | Encoding: UTF-8 33 | Collate: 34 | 'data.R' 35 | 'drop_cols.R' 36 | 'drop_rows.R' 37 | 'impute.R' 38 | 'make_impute.R' 39 | 'utils.R' 40 | 'impute_funs.R' 41 | 'na_predict.R' 42 | 'zzz.R' 43 | -------------------------------------------------------------------------------- /DESIGN.md: -------------------------------------------------------------------------------- 1 | # DESIGN.md - Design notes for na.actions pacakge 2 | 3 | This document tracks opinionated desicion about the **na.actions** package that 4 | largely have to do with the design choices made 5 | 6 | ## Goals 7 | 8 | The packages shoould handle be the single repository for functions/methods for 9 | working with missing values (NA) for all data science workflows. 10 | 11 | It should be extensible and be able to handle 12 | 13 | - recursive and atomistic values 14 | - types: categorical and continous variables 15 | - classes: specific classes 16 | 17 | 18 | ## Naming and Labels 19 | 20 | - The explicit value for `forcats::fct_explicit_na` is `(Missing)`; this is not 21 | adopted here because it is needlessly long, '(NA)' is used instead. 22 | - beginning variables with 23 | 24 | 25 | 26 | ## na.replace and 27 | 28 | ## Organization 29 | 30 | - na_replace works only on atomic vectors; 31 | - na_explicit additionally supports recursive objects and calls na_replace. 32 | 33 | ## Style Elements 34 | 35 | 36 | ## Behaviors 37 | 38 | - replacement is type/class-safe; the type will not be affected by the 39 | replacement. 40 | - Function names should follow the lower_snake_case naming conventions. This prevents 41 | collisions with functions from the *stats* package. It may make sense for 42 | `na.*` functions operate at a low-level on vectors and similar to the *stats* 43 | package while `na_*` vectors operate 44 | on a higher level. 45 | 46 | 47 | - Follow tidyverse styles 48 | - Arguments should be lower_snake_case 49 | - Arguments names should often be preceded by a '.' when following tidyverse 50 | styles 51 | - `NA_explicit_` 52 | - cannot be "NA" since it becomes impossible to distinguish it from true 53 | `NAs` when printing to the console. 54 | 55 | 56 | ## Simple Imputation 57 | 58 | na_replace( x, .na=mean ) 59 | na_replace( tbl, col1 = mean ) Or, 60 | na_replace( tbl, col1 = mean(col1) ) 61 | 62 | 63 | ## Complex Imputation 64 | 65 | Imputation should be preformed when the replacement value is a rhs-formula: 66 | 67 | na_replce(tbl, col1 = ~col2, .method=lm ) 68 | 69 | This has the effect of creating a model for col1 ~ col2 70 | 71 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This package is licenses under GPLv2 and is provided without warranty or 2 | support. For a copy of this license, refer to 3 | http://www.r-project.org/Licenses/GPL-2. If you are interested in other 4 | licensing arrangements, please contact the package maintainer. 5 | 6 | Copyright (c) 2018 Decision Patterns. Oakland, CA, USA. 7 | -------------------------------------------------------------------------------- /NAMESPACE: -------------------------------------------------------------------------------- 1 | # Generated by roxygen2: do not edit by hand 2 | 3 | export(drop_cols_all_na) 4 | export(drop_cols_any_na) 5 | export(drop_na_cols) 6 | export(drop_rows_all_na) 7 | export(drop_rows_any_na) 8 | export(filter_all_na) 9 | export(filter_any_na) 10 | export(impute) 11 | export(impute_all) 12 | export(impute_at) 13 | export(impute_if) 14 | export(make_impute_all) 15 | export(make_impute_at) 16 | export(make_impute_if) 17 | export(make_imputes) 18 | export(na_predict) 19 | exportPattern("^impute_.*$") 20 | import(na.tools) 21 | importFrom(dplyr,select_vars) 22 | importFrom(dplyr,vars) 23 | importFrom(methods,as) 24 | importFrom(rlang,eval_tidy) 25 | importFrom(rlang,quos) 26 | importFrom(stats,na.pass) 27 | -------------------------------------------------------------------------------- /NEWS.md: -------------------------------------------------------------------------------- 1 | ## Version 0.2.0 2 | 3 | - Replace `impute_most_freq*` with `impute_mode*` 4 | - Add `NA_explicit_` as an exported constant for explicit categorical values. 5 | - Convert man to use markdown. 6 | - Fix exports 7 | 8 | ## Version 0.1.1 (2018-01-22) 9 | 10 | - Fix `na_replace` (and `na_explicit`) to add levels for values if 11 | they do not already exist. 12 | - Add tests 13 | - Fix documentation 14 | 15 | ## Version 0.7.0 (2017-08-22) 16 | 17 | - Add na_explicit and na_implicit 18 | 19 | ## Version 0.6.2 20 | 21 | - na_replace: revert from using `ifelse` because of edge cases 22 | - add `zzz.R` 23 | - add `NEWS.md` 24 | - add tests for `na_replace` 25 | 26 | ## Version 0.6.1 27 | 28 | - `na_replace` now uses `ifelse` and prevent recycling `value` 29 | -------------------------------------------------------------------------------- /R/archive/na_explicit.R: -------------------------------------------------------------------------------- 1 | #' na_explicit 2 | #' 3 | #' Set missing values to an explicit value, 4 | #' 5 | #' @param x object; either atomic or recursive. 6 | #' @param .na either a single element vector list or named vectors; See #Details. 7 | #' @param ... (used for recursive structures only) a list of name=value pairs 8 | #' 9 | #' @details 10 | #' 11 | #' `na_explicit` replaces missing (`NA`) values in `x` with 12 | #' an explicit value set by the `.na` argument. It is largely an extension of 13 | #' [impute()] and supports table-like objects in a *tidyverse* compliant way. 14 | #' 15 | #' 16 | #' atomic x | .na==NULL | ... missing : error 17 | #' atomic x | .na==NULL | ... there : error 18 | #' atomic x | .na!=NULL | ... missing : all columns impute by .na 19 | #' atomic x | ,na!==NULL | ... there : all columns impute by .na, ... is extra args to f 20 | #' 21 | #' rec x | .na==NULL | ... missing : error 22 | #' rec x | .na==NULL | ... there : columns transformed by ... 23 | #' rec x | .na!=NULL | ... missing : all columns impute by .na (Should this be supported( ?) impute_all 24 | #' rec x | ,na!==NULL | ... there : all columns impute by .na, ... is extra args to f impute_ 25 | #' 26 | #' 27 | #' impute( .tbl, ... ) 28 | #' 29 | #' x .na!=NULL | ... missing : all columns set to `.na`` 30 | #' .na==NULL | col=x | col=na 31 | #' 32 | #' na_explicit( .tbl, col1=mean( . , na.rm=TRUE )... ) 33 | #' na_explicit 34 | #' 35 | #' **input: `x`** 36 | #' 37 | #' `x` can be either an *atomic* or *recursive* object. If *atomic* then 38 | #' `na_explicit` behaves as [impute()] an replaces missing values with `.na` 39 | #' and `...` is used to specify additional arguments if `.na` is a function. 40 | #' 41 | #' If `x` is *recursive* then missing values are replaced by `.na`/`...` in a 42 | #' dplyr manner. 43 | #' 44 | #' The default is to use 45 | #' [NA_explicit] 46 | #' [impute()] but explicitly but works on recursive 47 | #' 48 | #' It is also intended to be single argument function. 49 | #' 50 | #' @seealso 51 | #' 52 | #' - [impute()] 53 | #' - [na_implicit()] 54 | #' - forcats::fct_explicit_na() 55 | #' 56 | #' @examples 57 | #' 58 | #' na_explicit( c(1, NA, 3, 4), 0 ) 59 | #' na_explicit( c("A",NA,"c","D" ) ) 60 | #' 61 | #' na_explicit( c("A",NA,"c","D") ) 62 | #' 63 | #' na_explicit( ) 64 | #' 65 | #' @md 66 | #' @export 67 | 68 | na_explicit <- function(x, .na, ... ) 69 | UseMethod("na_explicit") 70 | 71 | 72 | #' @export 73 | na_explicit.default <- function(x, .na, ... ) 74 | if( is.recursive(x) ) 75 | .na_explicit.recursive(x, .na, ... ) else 76 | .na_explicit.atomic( x, .na, ... ) 77 | 78 | 79 | # Do not export - 80 | # these are internal functions that are dispatched by `na_explicit.default` 81 | 82 | .na_explicit.recursive <- function(x, .na=NULL, ... ) { 83 | 84 | if( ! is.null(.na) ) 85 | 86 | 87 | # First handle the name=values pairs 88 | # - use kv function 89 | # - if value is function apply it to x[[ key ]] 90 | for( kv in kv( list(...) ) ) { 91 | if( is.function(kv$v) ) 92 | val <- kv$v( x[[kv$k]] ) else 93 | val <- kv$v 94 | 95 | x[[kv$k]] <- na_explicit( x[[kv$k]], .na=val ) 96 | 97 | } 98 | 99 | x 100 | 101 | } 102 | 103 | 104 | .na_explicit.atomic <- function(x, .na, ... ) 105 | impute( x, .na ) 106 | 107 | 108 | #' @export 109 | na_explicit.character <- function(x, .na = NA_explicit_ ) { 110 | impute(x, .na) 111 | } 112 | 113 | 114 | #' @export 115 | na_explicit.factor <- function(x, .na = NA_explicit_ ) { 116 | impute(x, .na) 117 | } 118 | -------------------------------------------------------------------------------- /R/archive/na_replace.r: -------------------------------------------------------------------------------- 1 | #' na_replace - replace missing values in tables and recursive structures 2 | #' 3 | #' Replaces missing values (`NA`) in tables and lists 4 | #' 5 | #' @param tbl table or lsit 6 | #' @param ... specification of var=expr where expression can be a 7 | #' constant, vector of length( tbl[[var]] ) or function. See Details 8 | #' 9 | #' @examples 10 | #' 11 | #' data(mtcars) 12 | #' mtcars <- head(mtcars) 13 | #' mtcars[3,] <- NA_real_ 14 | #' 15 | #' na_replace( mtcars, mpg=-99, cyl=length ) 16 | #' 17 | #' data.table::setDT(mtcars) 18 | #' na_replace( mtcars, mpg=-99, cyl=length ) 19 | #' 20 | #' 21 | #' @details 22 | 23 | 24 | na_replace <- function( .tbl, ... ) UseMethod('na_replace') 25 | 26 | 27 | #' @export 28 | na_replace.default <- function( .tbl, ... ) { 29 | 30 | if( ! is.recursive( .tbl ) ) { 31 | # warning( "Use na.replace instead of na_replace for atomic objects.") 32 | return( na.replace( x=.tbl, ...) ) 33 | } 34 | 35 | # First handle the name=values pairs 36 | # - use kv function 37 | # - if value is function apply it to x[[ key ]] 38 | for( kv in kv( list(...) ) ) 39 | .tbl[[kv$k]] <- na.replace( .tbl[[kv$k]], .na=kv$v ) 40 | 41 | .tbl 42 | 43 | } 44 | -------------------------------------------------------------------------------- /R/data.R: -------------------------------------------------------------------------------- 1 | #' @docType data 2 | #' @title data with missing values 3 | #' 4 | #' @aliases nacars nacars_dt nairis nairis_dt 5 | #' 6 | #' @details 7 | #' 8 | #' **cars** and **iris** data sets with missing data for demonstration purposes. 9 | #' 10 | #' @md 11 | 12 | "nacars" 13 | -------------------------------------------------------------------------------- /R/drop_cols.R: -------------------------------------------------------------------------------- 1 | #' @title Remove columns with missing values 2 | #' 3 | #' @description Remove columns of a table whose values are all `NA` or who have any `NA` 4 | #' 5 | #' @param .tbl table-like object 6 | #' 7 | #' @details 8 | #' `drop_cols_all_na` removes all cols whose only values are `NA`. 9 | #' `drop_cols_any_na` removes columns that have any `NA`. They work on all 10 | #' table-like objects. 11 | #' 12 | #' @return 13 | #' An object of the same class as `data` with cols containing all 14 | #' `NA` values removed 15 | #' 16 | #' @seealso 17 | #' * [dplyr::select()] 18 | #' 19 | #' @md 20 | #' @import na.tools 21 | #' @rdname drop_cols 22 | #' @export 23 | 24 | drop_cols_all_na <- function(.tbl) 25 | .tbl[ , ! apply( .tbl, 2, all_na ) ] 26 | 27 | 28 | #' @rdname drop_cols 29 | #' @export 30 | 31 | drop_cols_any_na <- function(.tbl) 32 | .tbl[ , ! apply( .tbl, 2, any_na ) ] 33 | 34 | 35 | 36 | #' @rdname drop_cols 37 | #' @export 38 | 39 | drop_na_cols <- drop_cols_all_na 40 | -------------------------------------------------------------------------------- /R/drop_rows.R: -------------------------------------------------------------------------------- 1 | #' drop_rows_all_na, drop_rows_any_na 2 | #' 3 | #' Drop rows of a table whose values are all NA 4 | #' 5 | #' @param .tbl data-like object 6 | #' 7 | #' @details 8 | #' 9 | #' `na_drop_rows` removes all rows whose only values are NA. It works for all 10 | #' table-like objects. 11 | #' 12 | #' @return 13 | #' An object of the same class as `.tbl` with rows containing all 14 | #' `NA` values removed 15 | #' 16 | #' @seealso 17 | #' * [dplyr::filter()] 18 | #' 19 | #' @examples 20 | #' 21 | #' data(iris) 22 | #' 23 | #' .tbl <- iris[1:5,] 24 | #' .tbl[1:2,] <- NA 25 | #' .tbl[3,1] <- NA 26 | #' .tbl 27 | #' 28 | #' filter_all_na(.tbl) 29 | #' filter_any_na(.tbl) 30 | #' 31 | #' drop_rows_all_na(.tbl) 32 | #' drop_rows_any_na(.tbl) 33 | #' 34 | #' @md 35 | #' @rdname drop_rows 36 | #' @export 37 | 38 | drop_rows_all_na <- function(.tbl) 39 | .tbl[ ! apply( .tbl, 1, all_na ), ] 40 | 41 | #' @rdname drop_rows 42 | #' @export 43 | filter_all_na <- drop_rows_all_na 44 | 45 | 46 | #' @rdname drop_rows 47 | #' @export 48 | drop_rows_any_na <- function(.tbl) 49 | .tbl[ ! apply( .tbl, 1, any_na ), ] 50 | 51 | #' @rdname drop_rows 52 | #' @export 53 | 54 | filter_any_na <- drop_rows_any_na 55 | -------------------------------------------------------------------------------- /R/impute.R: -------------------------------------------------------------------------------- 1 | #' Replace missing values in tables and lists 2 | #' 3 | #' Replace missing values (`NA`) in a table and lists 4 | #' 5 | #' @param .tbl list-like or table-like structure. 6 | #' @param .na scalar, vector or function as described in [na.tools::na.replace()] 7 | #' @param .vars character; names of columns to be imputed 8 | #' @param .predicate dply-type predicate functions 9 | #' @param ... additional args; either a unnamed list of columns (quoted or not) 10 | #' or name=function pairs. See Details. 11 | #' 12 | #' @details 13 | #' 14 | #' `impute` is similar to other *dplyr* verbs especially [dplyr::mutate()]. Like 15 | #' [dplyr::mutate()] it operates on columns. It changes only missing values 16 | #' (`NA`) to the value specified by `.na`. 17 | #' 18 | #' **Behavior**: 19 | #' 20 | #' Behavior depends on the values of `.na` and `...`. 21 | #' 22 | #' `impute` can be used for three replacement operatations: 23 | #' 24 | #' 1. `impute( .tbl, .na )` : ( missing `...` ) Replace missing values 25 | #' in **ALL COLS** by `.na`. This is analogous to `impute_all`. 26 | #' 27 | #' 2. `impute( .tbl, .na, ... )` : ( `...` is an unnamed list) Replace 28 | #' column(s) specified in `...` by `.na`. Columns are specified as an 29 | #' unnamed list of quoted or unquoted column names. This is analogous to 30 | #' `impute_at` where `...` specifies `.vars` 31 | #' 32 | #' 3. `impute( .tbl. col1=na.*, col2=na.* )` : ( missing `.na` ) : 33 | #' Replace by column-specific `.na` 34 | #' 35 | #' Additional arguments are to `.na` are not used; Use `impute_at` for 36 | #' this or create your own lambda functions. 37 | #' 38 | #' @return 39 | #' 40 | #' Returns a object as the same type as `.tbl`. Columns are mutated to replace 41 | #' missing values (`NA`) with value specied by `.na` and `...` 42 | #' 43 | #' @seealso 44 | #' * The **na.tools** package. 45 | #' * `impute_functions` 46 | #' 47 | #' @examples 48 | #' 49 | #' data(nacars) 50 | #' 51 | #' \dontrun{ 52 | #' nacars %>% impute(0, mpg, cyl) 53 | #' nacars %>% impute(1:6, mpg, cyl) 54 | #' 55 | #' nacars %>% impute( na.mean ) 56 | #' nacars %>% impute( mean ) # unsafe 57 | #' nacars %>% impute( length, mpg, disp ) 58 | #' nacars %>% impute( mean, mpg, disp ) 59 | #' nacars %>% impute( mpg=na.mean, cyl=na.max ) 60 | #' nacars %>% impute( na.mean, c('mpg','disp') ) 61 | #' } 62 | #' @md 63 | #' @import na.tools 64 | #' @importFrom rlang eval_tidy quos 65 | #' @importFrom dplyr select_vars vars 66 | #' @export 67 | 68 | 69 | impute <- function (.tbl, .na, ...) 70 | { 71 | 72 | if( ! is.list(.tbl) & ! is.data.frame(.tbl) ) 73 | stop( "`impute` only works on lists and table") 74 | 75 | 76 | # if( missing(.na) && missing(...) ) 77 | # stop( "At least one of .na or ... must be provided.") 78 | 79 | # USAGE 1: missing(...) all columns mutated by .na 80 | if ( missing(...) ) { 81 | for( j in 1:length(.tbl) ) 82 | .tbl[[j]] <- na.replace( .tbl[[j]], .na ) 83 | return( .tbl ) 84 | } 85 | 86 | 87 | # vars: key-value list ... 88 | 89 | # TEST whether unknown columns were specified 90 | unknown <- setdiff( names(vars), names(.tbl) ) 91 | if( length(unknown) > 0 ) 92 | stop( paste( "Unknown columns:", paste(unknown, collapse=", "))) 93 | 94 | 95 | # USAGE 2: ... is column names 96 | # IF names were provided as part of columns list, we take 97 | if( ! missing(.na) && is_unnamed.quosure( quos(...) ) ) { 98 | vars <- select_vars( names(.tbl), ... ) 99 | for( j in vars ) 100 | .tbl[[j]] <- na.replace( .tbl[[j]], .na ) 101 | return(.tbl) 102 | } 103 | 104 | # USAGE 3: ... is col=na.fun pairs 105 | if( missing(.na) && is_named( quos(...)) ) { 106 | for ( . in kv( quos(...) ) ) { 107 | .na = rlang::eval_tidy( .$v ) 108 | .tbl[[.$k ]] <- na.replace( .tbl[[.$k]], .na=.na ) 109 | } 110 | return(.tbl) 111 | } 112 | 113 | if( ! missing(.na) && is_named( quos )) 114 | stop( "Specifying .na and col=.na is not allowed") 115 | 116 | } 117 | 118 | 119 | 120 | #' @note 121 | #' `...` is used to specify columns in `impute` but is used as additional 122 | #' arguments to `.na` in the other `impute_*` functions. 123 | #' 124 | #' @examples 125 | #' 126 | #' \dontrun{ 127 | #' nacars %>% impute_at( -99, .vars=1:3 ) 128 | #' nacars %>% impute_at( .na=na.mean, .vars=1:6 ) 129 | #' 130 | #' # Same, uses `...` for additional args 131 | #' nacars %>% 132 | #' impute_at( .na=mean , .vars=1:6, na.rm = TRUE ) 133 | #' 134 | #' nacars %>% impute_at( .na=na.mean, .vars = c('mpg','cyl', 'disp') ) 135 | #' } 136 | #' 137 | #' @importFrom dplyr select_vars 138 | #' @rdname impute 139 | #' @export 140 | 141 | impute_at <- function(.tbl, .na, .vars, ... ) { 142 | 143 | .vars <- dplyr::select_vars( names(.tbl), .vars ) 144 | for( i in .vars ) { 145 | .tbl[[i]] <- na.replace( x=.tbl[[i]], .na=.na, ... ) 146 | } 147 | .tbl 148 | 149 | } 150 | 151 | 152 | #' @details 153 | #' `impute_all` is like `impute` without specifying `...`. `...` is used 154 | #' for additional arguments to `.na` 155 | #' 156 | #' @examples 157 | #' 158 | #' \dontrun{ 159 | #' nacars %>% impute_all( -99 ) 160 | #' nacars %>% impute_all( na.min ) 161 | #' } 162 | #' 163 | #' @rdname impute 164 | #' @export 165 | 166 | impute_all <- function(.tbl, .na, ... ) { 167 | 168 | for( i in 1:length(.tbl) ) 169 | .tbl[[i]] <- na.replace( .tbl[[i]], .na, ... ) 170 | .tbl 171 | 172 | } 173 | 174 | 175 | #' @rdname impute 176 | #' @export 177 | impute_if <- function( .tbl, .na, .predicate, ... ) { 178 | 179 | for( i in 1:length(.tbl) ) 180 | if( .predicate(.tbl[[i]] ) ) 181 | .tbl[[i]] <- na.replace( .tbl[[i]], .na=.na, ... ) 182 | 183 | .tbl 184 | } 185 | -------------------------------------------------------------------------------- /R/impute_funs.R: -------------------------------------------------------------------------------- 1 | #' Table imputation methods 2 | #' 3 | #' Replace missing value methods with a variety of methods 4 | #' 5 | #' @param .tbl table-like or list-like structure 6 | #' @param .na value/function to be used for replacement 7 | #' @param .vars list of columns generated by vars(), or a character vector of 8 | #' column names, or a numeric vector of column positions. 9 | #' @param .predicate A predicate function to be applied to the columns or a 10 | #' logical vector. 11 | #' @param ... addition passed to the imputation method 12 | #' 13 | #' @details 14 | #' 15 | #' These methods are modelled closely after [dplyr::mutate()] and the select 16 | #' style verbs. Most of the functions depend on the **na.tools** package. 17 | #' 18 | #' Function List: 19 | #' * explicit: `impute_explicit`, `impute_explicit_at`, `impute_explicit_all`, `impute_explicit_if` 20 | #' * zero: `impute_zero`, `impute_zero_at`, `impute_zero_all`, `impute_zero_if` 21 | #' * inf: `impute_inf`, `impute_inf_at`, `impute_inf_all`, `impute_inf_if` 22 | #' * neginf: `impute_neginf`, `impute_neginf_at`, `impute_neginf_all`, `impute_neginf_if` 23 | #' * constant: `impute_constant`, `impute_constant_at`, `impute_constant_all`, `impute_constant_if` 24 | #' 25 | #' * max: `impute_max`, `impute_max_at`, `impute_max_all`, `impute_max_if` 26 | #' * min: `impute_min`, `impute_min_at`, `impute_min_all`, `impute_min_if` 27 | #' * median: `impute_median`, `impute_median_at`, `impute_median_all`, `impute_median_if` 28 | #' * mean: `impute_mean`, `impute_mean_at`, `impute_mean_all`, `impute_mean_if` 29 | #' * most_freq: `impute_most_freq`, `impute_most_freq_at`, `impute_most_freq_all`, `impute_most_freq_if` 30 | #' * quantile: `impute_quantile`, `impute_quantile_at`, `impute_quantile_all`, `impute_quantile_if` 31 | #' * sample: `impute_sample`, `impute_sample_at`, `impute_sample_all`, `impute_sample_if` 32 | #' * random: `impute_random`, `impute_random_at`, `impute_random_all`, `impute_random_if` 33 | #' * replace: `impute_replace`, `impute_replace_at`, `impute_replace_all`, `impute_replace_if` 34 | #' 35 | #' @examples 36 | #' 37 | #' \dontrun{ 38 | #' nacars %>% impute_zero() 39 | #' nacars %>% impute_zero( mpg, cyl ) 40 | #' nacars %>% impute_zero( "mpg", "cyl" ) 41 | #' nacars %>% impute_zero( c("mpg","cyl") ) 42 | #' nacars %>% impute_zero( 1:2 ) 43 | #' } 44 | #' @md 45 | #' @rawNamespace exportPattern("^impute_.*$") 46 | #' @include utils.R make_impute.R 47 | #' @aliases 48 | #' impute_explicit impute_explicit_at impute_explicit_all impute_explicit_if 49 | #' impute_zero impute_zero_at impute_zero_all impute_zero_if 50 | #' impute_true impute_true_at impute_true_all impute_true_if 51 | #' impute_false impute_false_at impute_false_all impute_false_if 52 | #' impute_inf impute_inf_at impute_inf_all impute_inf_if 53 | #' impute_neginf impute_neginf_at impute_neginf_all impute_neginf_if 54 | #' impute_constant impute_constant_at impute_constant_all impute_constant_if 55 | #' impute_max impute_max_at impute_max_all impute_max_if 56 | #' impute_min impute_min_at impute_min_all impute_min_if 57 | #' impute_median impute_median_at impute_median_all impute_median_if 58 | #' impute_mean impute_mean_at impute_mean_all impute_mean_if 59 | #' impute_mode impute_mode_at impute_mode_all impute_mode_if 60 | # impute_most_freq impute_most_freq_at impute_most_freq_all impute_most_freq_if 61 | #' impute_quantile impute_quantile_at impute_quantile_all impute_quantile_if 62 | #' impute_sample impute_sample_at impute_sample_all impute_sample_if 63 | #' impute_random impute_random_at impute_random_all impute_random_if 64 | #' impute_replace impute_replace_at impute_replace_all impute_replace_if 65 | #' @importFrom stats na.pass 66 | #' @importFrom methods as 67 | #' @rdname impute_functions 68 | 69 | impute_functions <- function( .tbl, .na, .vars, .predicate ) {} # just a stub 70 | 71 | assign_these( make_imputes(na.explicit) ) 72 | 73 | assign_these( make_imputes(na.zero) ) 74 | assign_these( make_imputes(na.true) ) 75 | assign_these( make_imputes(na.false) ) 76 | assign_these( make_imputes(na.inf) ) 77 | assign_these( make_imputes(na.neginf) ) 78 | assign_these( make_imputes(na.constant) ) 79 | 80 | 81 | assign_these( make_imputes(na.max) ) 82 | assign_these( make_imputes(na.min) ) 83 | assign_these( make_imputes(na.mean) ) 84 | assign_these( make_imputes(na.median) ) 85 | assign_these( make_imputes(na.mode) ) 86 | # assign_these( make_imputes(na.most_freq) ) 87 | assign_these( make_imputes(na.quantile) ) 88 | 89 | assign_these( make_imputes(na.sample) ) 90 | assign_these( make_imputes(na.random) ) 91 | assign_these( make_imputes(na.replace) ) 92 | -------------------------------------------------------------------------------- /R/make_impute.R: -------------------------------------------------------------------------------- 1 | #' Imputation metaprogramming 2 | #' 3 | #' Create functions that use a function for imputing 4 | #' 5 | #' @param fun value or function used for imputing. See Details. 6 | #' 7 | #' @details 8 | #' 9 | #' These functions make mutate-style impute functions using [impute()] and the 10 | #' supplied `.na` argument. 11 | #' 12 | #' `make_imputes` is a wrapper around the other functions and returns each as 13 | #' a list. 14 | #' 15 | #' @keywords internal 16 | #' @rdname make_impute 17 | 18 | make_impute <- function(fun) function(.tbl, ..., .na=fun ) 19 | impute(.tbl, .na=.na, ... ) 20 | 21 | 22 | #' @rdname make_impute 23 | #' @export 24 | make_impute_at <- function(fun) function( .tbl, .vars, ..., .na=fun ) impute_at( .tbl, .na=.na, .vars ) 25 | 26 | 27 | #' @rdname make_impute 28 | #' @export 29 | make_impute_all <- function(fun) function( .tbl, .na=fun, ... ) impute_all( .tbl, .na=.na, ... ) 30 | 31 | #' @rdname make_impute 32 | #' @export 33 | make_impute_if <- function(fun) function( .tbl, .predicate, ... ) impute_if( .tbl, .na=fun, .predicate, ... ) 34 | 35 | 36 | #' @rdname make_impute 37 | #' @export 38 | make_imputes <- function(.na) { 39 | nm <- deparse(substitute(.na)) 40 | nm <- sub("^na\\.", "", nm, perl=TRUE ) 41 | structure( 42 | list( 43 | make_impute(.na) 44 | , make_impute_at(.na) 45 | , make_impute_all(.na) 46 | , make_impute_if(.na) 47 | ) 48 | , names = paste("impute_", nm, c("", "_at", "_all", "_if" ), sep="" ) 49 | ) 50 | } 51 | 52 | 53 | 54 | #' #' @rdname imports 55 | #' #' @aliases impute_inf impute_inf_at impute_inf_all impute_inf_if 56 | #' #' @export 57 | #' na.inf %>% make_impute() %>% assign_these() 58 | #' 59 | #' # list( 60 | #' # impute = make_impute(.na) 61 | #' # , impute_at = make_impute_at(.na) 62 | #' # , impute_all = make_impute_all(.na) 63 | #' # , impute_if = make_impute_if(.na) 64 | #' # ) 65 | #' # } 66 | #' 67 | #' 68 | #' # impute_inf <- make_impute(na.inf) 69 | #' # imputes_inf <- make_imputes(na.inf) 70 | #' 71 | 72 | -------------------------------------------------------------------------------- /R/na_predict.R: -------------------------------------------------------------------------------- 1 | #' na_predict 2 | #' 3 | #' replace `NA` values by predictions of a model 4 | #' 5 | #' @param x data 6 | #' @param object object with predict method 7 | #' @param data data object 8 | #' 9 | #' @export 10 | 11 | na_predict <- function( x, object, data=x ) { 12 | 13 | if( length(x) != nrow(data) ) stop() 14 | 15 | return(x) 16 | } -------------------------------------------------------------------------------- /R/utils.R: -------------------------------------------------------------------------------- 1 | # Key value iteration 2 | # 3 | # Create a list with `k` and `v` elements useful for iteration 4 | # 5 | # @param x object such as vector or list to separate into key value pairs 6 | # @param ... additional args 7 | # 8 | # @details 9 | # 10 | # No magic here, just something simple to convert `x` into a list of 11 | # lists. Each element of `x` is broken into a list with elements `k` 12 | # (key) and `v` (value). See examples. 13 | # 14 | # For many cases, key-value iteration can be done with `*apply` or 15 | # `paste` functions. This is made to be explicit and work on a variery of 16 | # objects. 17 | # 18 | # @references 19 | # * [SO: for-loop-in-r-with-key-value](http://stackoverflow.com/questions/18572921/for-loop-in-r-with-key-value) 20 | # * [SO: iterate-over-key-value-pair-from-a-list](http://stackoverflow.com/questions/4500106/iterate-over-key-value-pair-from-a-list) 21 | # 22 | # @return 23 | # A named list of list; each element of `x` becomes a one element list 24 | # with elements `k` and `v` representing the keys and values 25 | # 26 | # @author 27 | # This function is taken from the *kv* package and is used with permission. 28 | # 29 | # @examples 30 | # 31 | # # Lists 32 | # li <- list(a=1,b=2,c=3) 33 | # kv(li) 34 | # 35 | # for( kv in kv(li) ) 36 | # cat( kv$k, ":", kv$v, "\n") 37 | # 38 | # 39 | # # vectors 40 | # v <- c(a=1, b=2, c=3 ) 41 | # kv(li) 42 | # 43 | # for( kv in kv(li) ) 44 | # cat( kv$k, ":", kv$v, "\n") 45 | # 46 | # @md 47 | 48 | kv <- function(x, ...) UseMethod('kv') 49 | 50 | # @export 51 | # @rdname kv 52 | 53 | kv.default <- function(x) { 54 | kv <- list() 55 | for( i in 1:length(x) ) { 56 | kv[[i]] = list( k=names(x)[[i]], v=x[[i]] ) 57 | } 58 | names(kv)=names(x) 59 | return(kv) 60 | } 61 | 62 | 63 | 64 | # @author decision patterns / christopher brown 65 | # Taken from the base.tools package with permission 66 | qw <- function (...) 67 | as.character(match.call())[-1] 68 | 69 | 70 | # @author decision patterns / christopher brown 71 | # Taken from the dimensional package with permission 72 | 73 | most_freq <- function (x, na.action = stats::na.pass) 74 | as(names(which.max(table(na.action(x), useNA = "always"))), class(x)) 75 | 76 | 77 | # Returns TRUE if the quosures are 78 | is_named <-function(x) ! is.null( attr(x, "names") ) 79 | is_unnamed <- function(x) is.null( attr(x, "names") ) 80 | is_named.quosure <- function(x) length( setdiff( names(x), "" ) ) == length(x) 81 | is_unnamed.quosure <- function(x) ! is_named.quosure(x) 82 | 83 | 84 | #' Assign named list to calling frame for setting up exports 85 | # assign list elements to parent frame by name 86 | #' @keywords internal 87 | assign_these <- function(x) 88 | for( nm in names(x) ) 89 | assign( nm, x[[nm]], envir=sys.frame( sys.nframe() -1 ) ) 90 | # assign( nm, x[[nm]], parent.frame() ) 91 | 92 | 93 | #' Export functions in list 94 | #' 95 | #' @param nms character list of name to export 96 | #' @param x list; named list of functions to export 97 | #' 98 | #' @details 99 | #' 100 | #' This uses the `@evalNamespace` directive to declare exports for objects by 101 | #' name or when provided in a function. 102 | #' 103 | #' ns_export <- function(nms) { 104 | #' sprintf("export(%s)", paste(nms, collapse = ",")) 105 | #' } 106 | #' 107 | #' ns_export_named <-function(x) { 108 | #' nms <- names(x) 109 | #' sprintf("export(%s)", paste(nms, collapse = ",")) 110 | #' } 111 | #' 112 | #' #' @evalNamespace ns_export(names(fns)) 113 | #' 114 | #' @seealso 115 | #' * [assign_these()] 116 | #' 117 | #' @keywords internal 118 | 119 | ns_export <- function(nms) { 120 | sprintf("export(%s)", paste(nms, collapse = ",")) 121 | } 122 | 123 | #' @rdname ns_export 124 | ns_export_function_list <-function(x) { 125 | nms <- names(x) 126 | sprintf("export(%s)", paste(nms, collapse = ",")) 127 | } 128 | -------------------------------------------------------------------------------- /R/zzz.R: -------------------------------------------------------------------------------- 1 | .onAttach <- function( libname, pkgname ) { 2 | 3 | suppressWarnings( try( v <- utils::packageVersion(pkgname, libname), silent = TRUE )) 4 | version <- if( exists('v') ) paste0("-", v ) else "" 5 | 6 | if( interactive() ) 7 | packageStartupMessage( 8 | pkgname , 9 | version , 10 | " - Copyright \u00a9 ", substr(Sys.Date(),1,4), 11 | " Decision Patterns" , 12 | domain = NA 13 | ) 14 | 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## tidyimpute 3 | 4 | 5 | > **Impute the tidyverse way** 6 | 7 | ![](https://img.shields.io/cran/v/tidyimpute.svg) 8 | ![](https://img.shields.io/cran/l/tidyimpute.svg) 9 | [![lifecycle](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://www.tidyverse.org/lifecycle/#stable) 10 | [![Downloads](https://cranlogs.r-pkg.org/badges/tidyimpute?color=brightgreen)](https://www.r-pkg.org/pkg/tidyimpute) 11 | [![](http://cranlogs.r-pkg.org/badges/grand-total/tidyimpute)](https://cran.rstudio.com/web/packages/tidyimpute/index.html) 12 | 13 | 14 | 15 | **tidyimpute** is tidtverse/dplyr compliant toolkit for imputing missing 16 | values (NA) values in list-like and table-like structures including data.tables. 17 | It had two goals: 1) extend existing `na.*` functions from the stats packages 18 | and 2) provide **dplyr**/**tidyverse** compliant methods for tables and lists. 19 | 20 | This package is based on the handy **na.tools** package which provides tools 21 | for working with missing values in vectors. 22 | 23 | ## Feature List 24 | 25 | * Over **80** functions for imputi missing values (See [#Function List] below.) 26 | * **dplyr**/**tidyverse** compliant inteface: 27 | * `impute_*` family of functions for table- or list-based imputations. 28 | * `impute_*_at`, `impute_*_all` and `impute_*_if` functions 29 | * Uses the **na.tools* package to ensure 30 | * Type/class and length-safe replacement. (**tidyimport** will never change 31 | produce an object with a different length/nrow or type/class of its target.) 32 | * General imputation methods 33 | * Generic imputation: `impute`, `impute_at`, `impute_all`, `impute_if` 34 | * Specialized imputation methods 35 | * Common imputations for: 36 | * constants: `0`, `-Inf`, `Inf` 37 | * univariate, commutative summary functions: `mean`, `median`, `max`, `min`, `zero` 38 | * (Coming Soon) univariate, non-commutive/ordered/time-series data: `loess`, `locf`, `locb` 39 | * (Coming Soon) model-based imputation 40 | * Support for recursive (lists and table-like structures) 41 | * Support for `tibble` 42 | * Support for `data.table` 43 | * Four extensible types of imputations 44 | 45 | 46 | ### Upcoming features 47 | 48 | * recall/track which values have been replaced 49 | * `by-group` calculations 50 | * Time-series/ordered/non-commutative methods 51 | * Model-based imputation 52 | - Model-based + by-groups 53 | 54 | 55 | ## Installation 56 | 57 | ### Github (Development Version) 58 | 59 | library(devtools) 60 | install_github( "decisionpatterns/tidyimport") 61 | 62 | 63 | ### CRAN 64 | 65 | R> install.packages("tidyimpute") 66 | 67 | 68 | ## Coming Soon ... 69 | 70 | * Impute by model 71 | * Memorable imputing 72 | 73 | 74 | ## Function List 75 | 76 | There are four types of imputation methods. They are distinguished by 77 | how the replacement values are calculated. Each is described below as well as 78 | describing each of the methods used. 79 | 80 | **Constants** 81 | 82 | In "constant" imputation methods, missing values are replaced by an 83 | *a priori* selected constant value. The vector containingmissing values 84 | is not used to calculate the replacement value. These take the form: `na.fun(x, ...)` 85 | 86 | * `impute_zero` - 0 87 | * `impute_inf` / `impute_neginf` - Inf/-Inf 88 | * `impute_constant` - Impute with a constant 89 | 90 | 91 | **Univariate** 92 | 93 | (Impute using function(s) of the target variable; When imputing in a table this 94 | is also called *column-based imputation* since the values used to derive the 95 | imputed come from the single column alone.) 96 | 97 | In "univariate" replacement methods, values are calculated using 98 | only the target vector, ie the one containing the missing values. The functions 99 | for performing the imputation are nominally univariate summary functions. 100 | Generally, the ordering of the vector does not affect imputed values. In general, 101 | one value is used to replace all missing values (`NA`) for a variable. 102 | 103 | * `impute_max` - maximum 104 | * `impute_minimum` - minumum 105 | * `impute_mean` - mean 106 | * `impute_median` - median value 107 | * `impute_quantile` - quantile value 108 | * `impute_sample` - randomly sampled value via bootstrap. 109 | 110 | 111 | **Ordered Univariate (Coming Soon)** 112 | 113 | (Impute using function(s) of the target variable. Variable ordering relevant. 114 | This is a super class of the previous **column-based imputation**.) 115 | 116 | In "ordered univariate" methods, replacement valuse are calculated 117 | from the vector that is assumed to be ordered. These types are very 118 | often used with **time-series** data. (Many of these functions are taken from 119 | or patterned after functions in the **zoo** package.) 120 | 121 | * `impute_loess` - loess smoother, assumes values are ordered 122 | * `impute_locf` - last observation carried forward, assumes ordered 123 | * `impute_nocb` - next observation carried backwards, assumes ordered 124 | 125 | 131 | 132 | **Multivariate (Coming Soon)** 133 | 134 | (Impute with multiple variables from the same observation. In tables, this is 135 | also called **row-based imputation** because imputed values derive from other 136 | measurement for the same observation. ) 137 | 138 | In "Multivariate" imputation, any value from the same row (observation) can be 139 | used to derive the replacement value. This is generally implemented as a model 140 | traing from the data with `var ~ ...` 141 | 142 | * `impute_fit`,`impute_predict` - use a model 143 | * `impute_by_group` - use by-group imputation 144 | 145 | 146 | **Generalized (Coming Soon)** 147 | 148 | (Impute with column and rows.) 149 | 150 | 151 | **Future:** 152 | 153 | * `unimpute`/`impute_restore` - restore NAs to the vector; remembering 154 | replacement 155 | * `impute_toggle` - toggle between `NA` and replacement values 156 | 157 | 158 | 159 | ## Examples 160 | 161 | tbl <- data.frame( col_1 = letters[1:3], col_2=c(1,NA_real_,3), col_3=3:1) 162 | 163 | impute( tbl, 2) 164 | impute_mean( tbl ) 165 | 166 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | ## TODO ## 2 | 3 | - [ ] Add `impute_mode_*` 4 | 5 | - [x] Add `impute_false_*` and `impute_true_*` 6 | 7 | - [ ] Support easybake(TM) "better recipes" 8 | 9 | - [ ] Should impute_max / impute_min should not return -Inf and +Inf for all 10 | NA rows or be consistent with na.mean and na.median 11 | 12 | - [x] Create Logo **Circle Ban** of `NA` 13 | 14 | - [x] `na[._]impute` as alias for `na[._]replace` respectively. 15 | 16 | - [x] `na.explicit` and `na_explicit` apply to factors only 17 | 18 | - [ ] Row-based imputation does not need to calculate every-value values for 19 | all observations, only the missing ones. This is different than column-based 20 | imputations which need values from all observations. There might be some 21 | efficiency gains from doing this. 22 | 23 | - [ ] There is a generalized imputation that uses both rows and columns and 24 | might automatically consider by-groups (how does the values of ) 25 | 26 | - [x] Is recall a part of 27 | - na.tools::na.replace only deals with vectors and references to multivariate 28 | replacement might be misplaced. 29 | - [x] tidyimpute::impute deals with tables and therefore is the pro 30 | - How to implement recall? 31 | - Recall should be able to take the same object. Identify the input. 32 | A recollection should: 33 | - test for the form of the input, 34 | - apply one or more 35 | - recall: 36 | - test for input: digest(.tbl[0,]) 37 | - a functions with arguments modified except the input. 38 | impute( . , .na, ... ) 39 | 40 | 41 | ### `coerce_safe` 42 | 43 | - [ ] Move `coerce_safe` to the **coercion** package. [ ] Import **coercion**. 44 | 45 | - _all, _if, _at 46 | - na_replace_all( .tbl, .funs, ... ) 47 | - na_replace_if( .tbl, .predicate, .funs, ... ) 48 | - na_replace_at( .tbl, .predicate, .funs, ... ) 49 | 50 | 51 | 52 | So .tbl %>% na_replace_all( iris, 3, ...) 53 | na_replace( iris, mean, na.rm=TRUE ) 54 | na_replace_if( iris, is.cont, mean, na.rm=TRUE ) 55 | na_replace_at( iris, ! Species, mean, na.rm=TRUE ) 56 | 57 | 58 | - [ ] Support atomics with `impute` 59 | - na_replace and na_explicit 60 | - [x] replace by scalar? (Low-level) 61 | - [x] replace by vector? (Other) 62 | - [x] replace by unary function? () 63 | - [x] replace by function of multiple args: `impute_*` 64 | - [ ] replace by model/formula? () 65 | - [ ] store .na value (if scalar) 66 | - [ ] store replaced idxs --- like na.omit 67 | 68 | - Implement slow functions with Rcpp 69 | 70 | - Might there be a clever way to allow something like: 71 | NA_explicit_ <- . %>% mean(., na.rm=TRUE) 72 | This will not work 73 | 74 | - [ ] Consider having an option for values for the na_level, e.g. 75 | options( na_explicit = "(Missing)" ) or, 76 | options( na_explicit = mean ) 77 | - [x] Categorical and continuous variables must be different. 78 | - [ ] Explicit value might depend on the class, type (cat vs. cont), or on a 79 | specific attribute, `na_explicit` or `na` of the specific vari`able. 80 | 81 | - [ ] Consider how explicit NA will be treated in sorting 82 | - [ ] Do we want exceptional values first or last? 83 | 84 | - [ ] Use **catcont** package? 85 | 86 | - [x] `na_replace` and `na_explicit` are getting very similar and should probably be 87 | made aliases 88 | 89 | - [ ] Devise syntax of related to list-like/recursive objects 90 | - applying a function to an **entire** vs. 91 | - applying to each **element** object 92 | See na_explicit and na_implicit 93 | 94 | 95 | ### Completed 96 | 97 | - [x] na_drop_rows, na_drop_cols for table-like objects 98 | - Remove rows/cols with all NAs 99 | - [x] Make na_replace vectorized, e.g. na_replace( value=... ) 100 | - [x] na_ifelse for na_replace 101 | 102 | -------------------------------------------------------------------------------- /data/nacars.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decisionpatterns/tidyimpute/9e07748f4b434105e2e122df1603817f3c2ab856/data/nacars.rda -------------------------------------------------------------------------------- /data/nacars_dt.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decisionpatterns/tidyimpute/9e07748f4b434105e2e122df1603817f3c2ab856/data/nacars_dt.rda -------------------------------------------------------------------------------- /data/nairis.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decisionpatterns/tidyimpute/9e07748f4b434105e2e122df1603817f3c2ab856/data/nairis.rda -------------------------------------------------------------------------------- /data/nairis_dt.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decisionpatterns/tidyimpute/9e07748f4b434105e2e122df1603817f3c2ab856/data/nairis_dt.rda -------------------------------------------------------------------------------- /inst/extdata/nacars.R: -------------------------------------------------------------------------------- 1 | #' Make nacars 2 | 3 | data(mtcars) 4 | nacars <- head(mtcars) 5 | nacars[ c(3,5),] <- NA_real_ 6 | nacars[ , c(3,5) ] <- NA_real_ 7 | nacars 8 | 9 | devtools::use_data(nacars, overwrite=TRUE) 10 | 11 | library(data.table) 12 | nacars_dt <- nacars 13 | setDT(nacars_dt) 14 | nacars_dt <- data.table( nacars ) 15 | 16 | devtools::use_data(nacars_dt, overwrite = TRUE ) 17 | 18 | 19 | -------------------------------------------------------------------------------- /man/assign_these.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/utils.R 3 | \name{assign_these} 4 | \alias{assign_these} 5 | \title{Assign named list to calling frame for setting up exports} 6 | \usage{ 7 | assign_these(x) 8 | } 9 | \description{ 10 | Assign named list to calling frame for setting up exports 11 | } 12 | \keyword{internal} 13 | -------------------------------------------------------------------------------- /man/drop_cols.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/drop_cols.R 3 | \name{drop_cols_all_na} 4 | \alias{drop_cols_all_na} 5 | \alias{drop_cols_any_na} 6 | \alias{drop_na_cols} 7 | \title{Remove columns with missing values} 8 | \usage{ 9 | drop_cols_all_na(.tbl) 10 | 11 | drop_cols_any_na(.tbl) 12 | 13 | drop_na_cols(.tbl) 14 | } 15 | \arguments{ 16 | \item{.tbl}{table-like object} 17 | } 18 | \value{ 19 | An object of the same class as \code{data} with cols containing all 20 | \code{NA} values removed 21 | } 22 | \description{ 23 | Remove columns of a table whose values are all \code{NA} or who have any \code{NA} 24 | } 25 | \details{ 26 | \code{drop_cols_all_na} removes all cols whose only values are \code{NA}. 27 | \code{drop_cols_any_na} removes columns that have any \code{NA}. They work on all 28 | table-like objects. 29 | } 30 | \seealso{ 31 | \itemize{ 32 | \item \code{\link[dplyr:select]{dplyr::select()}} 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /man/drop_rows.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/drop_rows.R 3 | \name{drop_rows_all_na} 4 | \alias{drop_rows_all_na} 5 | \alias{filter_all_na} 6 | \alias{drop_rows_any_na} 7 | \alias{filter_any_na} 8 | \title{drop_rows_all_na, drop_rows_any_na} 9 | \usage{ 10 | drop_rows_all_na(.tbl) 11 | 12 | filter_all_na(.tbl) 13 | 14 | drop_rows_any_na(.tbl) 15 | 16 | filter_any_na(.tbl) 17 | } 18 | \arguments{ 19 | \item{.tbl}{data-like object} 20 | } 21 | \value{ 22 | An object of the same class as \code{.tbl} with rows containing all 23 | \code{NA} values removed 24 | } 25 | \description{ 26 | Drop rows of a table whose values are all NA 27 | } 28 | \details{ 29 | \code{na_drop_rows} removes all rows whose only values are NA. It works for all 30 | table-like objects. 31 | } 32 | \examples{ 33 | 34 | data(iris) 35 | 36 | .tbl <- iris[1:5,] 37 | .tbl[1:2,] <- NA 38 | .tbl[3,1] <- NA 39 | .tbl 40 | 41 | filter_all_na(.tbl) 42 | filter_any_na(.tbl) 43 | 44 | drop_rows_all_na(.tbl) 45 | drop_rows_any_na(.tbl) 46 | 47 | } 48 | \seealso{ 49 | \itemize{ 50 | \item \code{\link[dplyr:filter]{dplyr::filter()}} 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /man/figures/hexagon_blue_tidyimpute_v1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decisionpatterns/tidyimpute/9e07748f4b434105e2e122df1603817f3c2ab856/man/figures/hexagon_blue_tidyimpute_v1.0.png -------------------------------------------------------------------------------- /man/figures/hexagon_blue_tidyimpute_v1.0.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ]> 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 31 | 32 | 44 | 53 | 58 | 65 | 76 | 85 | 90 | 97 | 109 | 110 | 111 | 112 | 139 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 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 223 | QU3f+5qGNGRHphCVCtpbtyENdsU0hSMwelSMsVW8xm1Iy1a7GiVxSItu1PaTFq8/0cZ6hHCG92OU 224 | EzDGugmOEtLs7adZjaIZ2oh5Chy6iTk/yEuVZtNJIgi2iEmzWIuj+iVqWpnL3Hku9bv2kiq0wE59 225 | Td1nzn+fnN7Pp/5SYmy/L9AFRY0xSAmFRmi8ic7vwEY88FL9+ifK+BZatnofscY3VVKDOCXupPAY 226 | Ignkuad9oPD0dP/TrRVb1W38M9hm3+Jvila76MnR3RD4af2/tcZprfNWc1p6YvLUrbXTqbyiikuq 227 | EmmQPjIsT986RD8RloPhWyStoO8t71jUHzTwYPS1JKN5nZ7ncKzRClY/jqABKV5Cx0S3XakGu2f/ 228 | y6ra/G4rfPun1zqodZr9yD+v/FU7AoO93m7UtnyuF6eHvohOs9KXmNDX5qP1927d4c2VAM+MUCbk 229 | q1BBLNLSFVwWfzjxnzw+EEHo8dk6L+ztWXqxhtxNel5c15/NxY2rl7yUXzzKLm589FT8pWirv5ZV 230 | 58Ev5xd5sKJuXPS2i2/2zufu1Nlapfgm3aw7T5XFtTPjIz2v7q6ls/m5Mxgmvbj+uZqeP76100sf 231 | dXj2/JZLL/4sn6eXjq6L6ax0pEj5tZsMGV9PF+Z/aV2lewSzK35qGyfP6+q2pVrGrfF1u5p9LrfM 232 | 36r06j6Vdp9qBRim01lfe9laah/vbx7Y3XVrd/V3rty61a5KnftbqXhbvrkor22tVeWFLbPJhlGn 233 | B1scIo2ur9PR0ktXj3vprJW10ovV3Dmuy0JYKb309Kqn5+ufjfR8b7uOi5sXF6ctneGvbZjJ/RZZ 234 | yLq9O/3HXRIMQ1bVTT/MFZW59cmir1Uu37V2lI2p3Uf4c6chvc7eFPlCDrudzkr3qg== 235 | 236 | 237 | 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 309 | 310 | 311 | 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 383 | 384 | 385 | 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 457 | 458 | 459 | 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 531 | 532 | 533 | 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 605 | 606 | 607 | 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 671 | 672 | 673 | 674 | -------------------------------------------------------------------------------- /man/impute.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/impute.R 3 | \name{impute} 4 | \alias{impute} 5 | \alias{impute_at} 6 | \alias{impute_all} 7 | \alias{impute_if} 8 | \title{Replace missing values in tables and lists} 9 | \usage{ 10 | impute(.tbl, .na, ...) 11 | 12 | impute_at(.tbl, .na, .vars, ...) 13 | 14 | impute_all(.tbl, .na, ...) 15 | 16 | impute_if(.tbl, .na, .predicate, ...) 17 | } 18 | \arguments{ 19 | \item{.tbl}{list-like or table-like structure.} 20 | 21 | \item{.na}{scalar, vector or function as described in \code{\link[na.tools:na.replace]{na.tools::na.replace()}}} 22 | 23 | \item{...}{additional args; either a unnamed list of columns (quoted or not) 24 | or name=function pairs. See Details.} 25 | 26 | \item{.vars}{character; names of columns to be imputed} 27 | 28 | \item{.predicate}{dply-type predicate functions} 29 | } 30 | \value{ 31 | Returns a object as the same type as \code{.tbl}. Columns are mutated to replace 32 | missing values (\code{NA}) with value specied by \code{.na} and \code{...} 33 | } 34 | \description{ 35 | Replace missing values (\code{NA}) in a table and lists 36 | } 37 | \details{ 38 | \code{impute} is similar to other \emph{dplyr} verbs especially \code{\link[dplyr:mutate]{dplyr::mutate()}}. Like 39 | \code{\link[dplyr:mutate]{dplyr::mutate()}} it operates on columns. It changes only missing values 40 | (\code{NA}) to the value specified by \code{.na}. 41 | 42 | \strong{Behavior}: 43 | 44 | Behavior depends on the values of \code{.na} and \code{...}. 45 | 46 | \code{impute} can be used for three replacement operatations: 47 | \enumerate{ 48 | \item \code{impute( .tbl, .na )} : ( missing \code{...} ) Replace missing values 49 | in \strong{ALL COLS} by \code{.na}. This is analogous to \code{impute_all}. 50 | \item \code{impute( .tbl, .na, ... )} : ( \code{...} is an unnamed list) Replace 51 | column(s) specified in \code{...} by \code{.na}. Columns are specified as an 52 | unnamed list of quoted or unquoted column names. This is analogous to 53 | \code{impute_at} where \code{...} specifies \code{.vars} 54 | \item \code{impute( .tbl. col1=na.*, col2=na.* )} : ( missing \code{.na} ) : 55 | Replace by column-specific \code{.na} 56 | } 57 | 58 | Additional arguments are to \code{.na} are not used; Use \code{impute_at} for 59 | this or create your own lambda functions. 60 | 61 | \code{impute_all} is like \code{impute} without specifying \code{...}. \code{...} is used 62 | for additional arguments to \code{.na} 63 | } 64 | \note{ 65 | \code{...} is used to specify columns in \code{impute} but is used as additional 66 | arguments to \code{.na} in the other \code{impute_*} functions. 67 | } 68 | \examples{ 69 | 70 | data(nacars) 71 | 72 | \dontrun{ 73 | nacars \%>\% impute(0, mpg, cyl) 74 | nacars \%>\% impute(1:6, mpg, cyl) 75 | 76 | nacars \%>\% impute( na.mean ) 77 | nacars \%>\% impute( mean ) # unsafe 78 | nacars \%>\% impute( length, mpg, disp ) 79 | nacars \%>\% impute( mean, mpg, disp ) 80 | nacars \%>\% impute( mpg=na.mean, cyl=na.max ) 81 | nacars \%>\% impute( na.mean, c('mpg','disp') ) 82 | } 83 | 84 | \dontrun{ 85 | nacars \%>\% impute_at( -99, .vars=1:3 ) 86 | nacars \%>\% impute_at( .na=na.mean, .vars=1:6 ) 87 | 88 | # Same, uses `...` for additional args 89 | nacars \%>\% 90 | impute_at( .na=mean , .vars=1:6, na.rm = TRUE ) 91 | 92 | nacars \%>\% impute_at( .na=na.mean, .vars = c('mpg','cyl', 'disp') ) 93 | } 94 | 95 | 96 | \dontrun{ 97 | nacars \%>\% impute_all( -99 ) 98 | nacars \%>\% impute_all( na.min ) 99 | } 100 | 101 | } 102 | \seealso{ 103 | \itemize{ 104 | \item The \strong{na.tools} package. 105 | \item \code{impute_functions} 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /man/impute_functions.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/impute_funs.R 3 | \name{impute_functions} 4 | \alias{impute_functions} 5 | \alias{impute_explicit} 6 | \alias{impute_explicit_at} 7 | \alias{impute_explicit_all} 8 | \alias{impute_explicit_if} 9 | \alias{impute_zero} 10 | \alias{impute_zero_at} 11 | \alias{impute_zero_all} 12 | \alias{impute_zero_if} 13 | \alias{impute_true} 14 | \alias{impute_true_at} 15 | \alias{impute_true_all} 16 | \alias{impute_true_if} 17 | \alias{impute_false} 18 | \alias{impute_false_at} 19 | \alias{impute_false_all} 20 | \alias{impute_false_if} 21 | \alias{impute_inf} 22 | \alias{impute_inf_at} 23 | \alias{impute_inf_all} 24 | \alias{impute_inf_if} 25 | \alias{impute_neginf} 26 | \alias{impute_neginf_at} 27 | \alias{impute_neginf_all} 28 | \alias{impute_neginf_if} 29 | \alias{impute_constant} 30 | \alias{impute_constant_at} 31 | \alias{impute_constant_all} 32 | \alias{impute_constant_if} 33 | \alias{impute_max} 34 | \alias{impute_max_at} 35 | \alias{impute_max_all} 36 | \alias{impute_max_if} 37 | \alias{impute_min} 38 | \alias{impute_min_at} 39 | \alias{impute_min_all} 40 | \alias{impute_min_if} 41 | \alias{impute_median} 42 | \alias{impute_median_at} 43 | \alias{impute_median_all} 44 | \alias{impute_median_if} 45 | \alias{impute_mean} 46 | \alias{impute_mean_at} 47 | \alias{impute_mean_all} 48 | \alias{impute_mean_if} 49 | \alias{impute_mode} 50 | \alias{impute_mode_at} 51 | \alias{impute_mode_all} 52 | \alias{impute_mode_if} 53 | \alias{impute_quantile} 54 | \alias{impute_quantile_at} 55 | \alias{impute_quantile_all} 56 | \alias{impute_quantile_if} 57 | \alias{impute_sample} 58 | \alias{impute_sample_at} 59 | \alias{impute_sample_all} 60 | \alias{impute_sample_if} 61 | \alias{impute_random} 62 | \alias{impute_random_at} 63 | \alias{impute_random_all} 64 | \alias{impute_random_if} 65 | \alias{impute_replace} 66 | \alias{impute_replace_at} 67 | \alias{impute_replace_all} 68 | \alias{impute_replace_if} 69 | \title{Table imputation methods} 70 | \usage{ 71 | impute_functions(.tbl, .na, .vars, .predicate) 72 | } 73 | \arguments{ 74 | \item{.tbl}{table-like or list-like structure} 75 | 76 | \item{.na}{value/function to be used for replacement} 77 | 78 | \item{.vars}{list of columns generated by vars(), or a character vector of 79 | column names, or a numeric vector of column positions.} 80 | 81 | \item{.predicate}{A predicate function to be applied to the columns or a 82 | logical vector.} 83 | 84 | \item{...}{addition passed to the imputation method} 85 | } 86 | \description{ 87 | Replace missing value methods with a variety of methods 88 | } 89 | \details{ 90 | These methods are modelled closely after \code{\link[dplyr:mutate]{dplyr::mutate()}} and the select 91 | style verbs. Most of the functions depend on the \strong{na.tools} package. 92 | 93 | Function List: 94 | \itemize{ 95 | \item explicit: \code{impute_explicit}, \code{impute_explicit_at}, \code{impute_explicit_all}, \code{impute_explicit_if} 96 | \item zero: \code{impute_zero}, \code{impute_zero_at}, \code{impute_zero_all}, \code{impute_zero_if} 97 | \item inf: \code{impute_inf}, \code{impute_inf_at}, \code{impute_inf_all}, \code{impute_inf_if} 98 | \item neginf: \code{impute_neginf}, \code{impute_neginf_at}, \code{impute_neginf_all}, \code{impute_neginf_if} 99 | \item constant: \code{impute_constant}, \code{impute_constant_at}, \code{impute_constant_all}, \code{impute_constant_if} 100 | \item max: \code{impute_max}, \code{impute_max_at}, \code{impute_max_all}, \code{impute_max_if} 101 | \item min: \code{impute_min}, \code{impute_min_at}, \code{impute_min_all}, \code{impute_min_if} 102 | \item median: \code{impute_median}, \code{impute_median_at}, \code{impute_median_all}, \code{impute_median_if} 103 | \item mean: \code{impute_mean}, \code{impute_mean_at}, \code{impute_mean_all}, \code{impute_mean_if} 104 | \item most_freq: \code{impute_most_freq}, \code{impute_most_freq_at}, \code{impute_most_freq_all}, \code{impute_most_freq_if} 105 | \item quantile: \code{impute_quantile}, \code{impute_quantile_at}, \code{impute_quantile_all}, \code{impute_quantile_if} 106 | \item sample: \code{impute_sample}, \code{impute_sample_at}, \code{impute_sample_all}, \code{impute_sample_if} 107 | \item random: \code{impute_random}, \code{impute_random_at}, \code{impute_random_all}, \code{impute_random_if} 108 | \item replace: \code{impute_replace}, \code{impute_replace_at}, \code{impute_replace_all}, \code{impute_replace_if} 109 | } 110 | } 111 | \examples{ 112 | 113 | \dontrun{ 114 | nacars \%>\% impute_zero() 115 | nacars \%>\% impute_zero( mpg, cyl ) 116 | nacars \%>\% impute_zero( "mpg", "cyl" ) 117 | nacars \%>\% impute_zero( c("mpg","cyl") ) 118 | nacars \%>\% impute_zero( 1:2 ) 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /man/make_impute.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/make_impute.R 3 | \name{make_impute} 4 | \alias{make_impute} 5 | \alias{make_impute_at} 6 | \alias{make_impute_all} 7 | \alias{make_impute_if} 8 | \alias{make_imputes} 9 | \title{Imputation metaprogramming} 10 | \usage{ 11 | make_impute(fun) 12 | 13 | make_impute_at(fun) 14 | 15 | make_impute_all(fun) 16 | 17 | make_impute_if(fun) 18 | 19 | make_imputes(.na) 20 | } 21 | \arguments{ 22 | \item{fun}{value or function used for imputing. See Details.} 23 | } 24 | \description{ 25 | Create functions that use a function for imputing 26 | } 27 | \details{ 28 | These functions make mutate-style impute functions using \code{\link[=impute]{impute()}} and the 29 | supplied \code{.na} argument. 30 | 31 | \code{make_imputes} is a wrapper around the other functions and returns each as 32 | a list. 33 | } 34 | \keyword{internal} 35 | -------------------------------------------------------------------------------- /man/na_predict.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/na_predict.R 3 | \name{na_predict} 4 | \alias{na_predict} 5 | \title{na_predict} 6 | \usage{ 7 | na_predict(x, object, data = x) 8 | } 9 | \arguments{ 10 | \item{x}{data} 11 | 12 | \item{object}{object with predict method} 13 | 14 | \item{data}{data object} 15 | } 16 | \description{ 17 | replace \code{NA} values by predictions of a model 18 | } 19 | -------------------------------------------------------------------------------- /man/nacars.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/data.R 3 | \docType{data} 4 | \name{nacars} 5 | \alias{nacars} 6 | \alias{nacars_dt} 7 | \alias{nairis} 8 | \alias{nairis_dt} 9 | \title{data with missing values} 10 | \format{An object of class \code{data.frame} with 6 rows and 11 columns.} 11 | \usage{ 12 | nacars 13 | } 14 | \description{ 15 | data with missing values 16 | } 17 | \details{ 18 | \strong{cars} and \strong{iris} data sets with missing data for demonstration purposes. 19 | } 20 | \keyword{datasets} 21 | -------------------------------------------------------------------------------- /man/ns_export.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/utils.R 3 | \name{ns_export} 4 | \alias{ns_export} 5 | \alias{ns_export_function_list} 6 | \title{Export functions in list} 7 | \usage{ 8 | ns_export(nms) 9 | 10 | ns_export_function_list(x) 11 | } 12 | \arguments{ 13 | \item{nms}{character list of name to export} 14 | 15 | \item{x}{list; named list of functions to export} 16 | } 17 | \description{ 18 | Export functions in list 19 | } 20 | \details{ 21 | This uses the \code{@evalNamespace} directive to declare exports for objects by 22 | name or when provided in a function. 23 | 24 | ns_export <- function(nms) { 25 | sprintf("export(%s)", paste(nms, collapse = ",")) 26 | } 27 | 28 | ns_export_named <-function(x) { 29 | nms <- names(x) 30 | sprintf("export(%s)", paste(nms, collapse = ",")) 31 | } 32 | 33 | #' @evalNamespace ns_export(names(fns)) 34 | } 35 | \seealso{ 36 | \itemize{ 37 | \item \code{\link[=assign_these]{assign_these()}} 38 | } 39 | } 40 | \keyword{internal} 41 | -------------------------------------------------------------------------------- /tests/testthat.R: -------------------------------------------------------------------------------- 1 | library(testthat) 2 | library(tidyimpute) 3 | 4 | test_check("tidyimpute") 5 | -------------------------------------------------------------------------------- /tests/testthat/test-impute.R.off: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | context("na_explicit") 4 | 5 | 6 | context( ".. data.frame") 7 | test_that( "na_explicit.data.frame", { 8 | 9 | data(iris) 10 | iris <- head(iris) 11 | iris[3,] <- NA 12 | 13 | iris %>% na_explicit(3) 14 | 15 | 16 | }) 17 | 18 | 19 | 20 | 21 | 22 | ## NOTE: 23 | ## since na_explicit extends na_explicit ... the following test are just copied 24 | ## from test-na_explicit.R with the na_explicit => na_explicit 25 | 26 | context(".. continous-integer") 27 | test_that("na_explicit-continuous-integer", { 28 | 29 | # REPLACE with scalar 30 | v <- 1:3 31 | v[2] <- NA_integer_ 32 | 33 | v %>% na_explicit(0) %T>% 34 | expect_is("integer") %>% 35 | expect_equal( c(1,0,3) ) 36 | 37 | v %>% na_explicit(2) %T>% 38 | expect_is("integer") %>% 39 | expect_equal( c(1,2,3) ) 40 | 41 | v <- 1:4 42 | v[ c(2,4) ] <- NA_integer_ 43 | v %>% na_explicit(2) %T>% 44 | expect_is("integer") %>% 45 | expect_equal( c(1,2,3,2) ) # 1 2 3 2 46 | 47 | # REPLACE with VECTOR 48 | v %>% na_explicit(1:4) %T>% 49 | expect_is("integer") %>% 50 | expect_equal(1:4) # 1 2 3 4 51 | 52 | # REPLACE by non-consistent class/type 53 | expect_error( v %>% na_explicit("a") ) 54 | 55 | }) 56 | 57 | 58 | context(".. continous-numeric") 59 | test_that("na_explicit-continuous-integer", { 60 | 61 | # REPLACE with scalar 62 | v <- 1:3 %>% as.numeric() 63 | v[2] <- NA_real_ 64 | 65 | v %>% na_explicit(0) %T>% 66 | expect_is("numeric") %>% 67 | expect_equal( c(1,0,3) ) 68 | 69 | v %>% na_explicit(2) %T>% 70 | expect_is("numeric") %>% 71 | expect_equal( c(1,2,3) ) 72 | 73 | v <- 1:4 74 | v[ c(2,4) ] <- NA_real_ 75 | v %>% na_explicit(2) %T>% 76 | expect_is("numeric") %>% 77 | expect_equal( c(1,2,3,2) ) # 1 2 3 2 78 | 79 | # REPLACE with VECTOR 80 | v %>% na_explicit(1:4) %T>% 81 | expect_is("numeric") %>% 82 | expect_equal(1:4) # 1 2 3 4 83 | 84 | # REPLACE with non-consistent class/type 85 | expect_error( v %>% na_explicit("a") ) 86 | 87 | }) 88 | 89 | 90 | 91 | context(".. character") 92 | test_that("na_explicit-character", { 93 | 94 | # REPLACE with SCALAR 95 | v <- letters[1:4] 96 | v[c(2,4)] <- NA_character_ 97 | 98 | v %>% na_explicit("x") %T>% 99 | expect_is("character") %>% 100 | expect_equivalent( c("a","x","c","x")) 101 | 102 | # REPLACE with VECTOR 103 | v %>% na_explicit(letters[1:4]) %T>% 104 | expect_is("character") %>% 105 | expect_equivalent( letters[1:4] ) 106 | 107 | # REPLACE by DEFAULT 108 | v %>% na_explicit() %T>% 109 | expect_is("character") %>% 110 | expect_equivalent( c("a","(NA)","c","(NA)")) 111 | 112 | 113 | # REPLACE with non-consistent class 114 | v %>% na_explicit(1L) %T>% 115 | expect_is("character") %>% 116 | expect_equivalent( c("a","1","c","1") ) 117 | 118 | 119 | }) 120 | 121 | 122 | context( ".. factor") 123 | test_that( "na_explicit factor", { 124 | 125 | fct <- letters[1:5] 126 | fct[c(2,5)] <- NA 127 | fct <- as.factor(fct) 128 | 129 | # REPLACE with scalar 130 | ans <- factor( qw(a, z, c, d, z) ) 131 | fct %>% na_explicit("z") %T>% 132 | expect_is("factor") %T>% 133 | { . %>% levels %>% expect_equal(levels(ans)) } %>% 134 | expect_equivalent( as.factor(ans) ) 135 | 136 | # REPLACE with vectoe 137 | ans <- factor( letters[1:5], levels=qw(a,c,d,b,e) ) 138 | fct %>% na_explicit(letters[1:5]) %T>% 139 | expect_is("factor") %T>% 140 | { . %>% levels %>% expect_equal(levels(ans)) } %T>% 141 | expect_equivalent(ans) 142 | 143 | # REPALCE with default 144 | ans <- factor( qw(a,(NA),c,d,(NA)), levels=qw(a,c,d,(NA)) ) 145 | fct %>% na_explicit() %T>% 146 | expect_is("factor") %T>% 147 | { . %>% levels %>% expect_equal( levels(ans) ) } %>% 148 | expect_equivalent(ans) 149 | 150 | }) 151 | -------------------------------------------------------------------------------- /tests/testthat/test-impute_.R: -------------------------------------------------------------------------------- 1 | context("impute_ ") 2 | 3 | # Just here to make the tests look pretty. -------------------------------------------------------------------------------- /tests/testthat/test-impute_max.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | 4 | data("nairis") 5 | 6 | context( ".. impute_max") 7 | test_that("impute_max", { 8 | 9 | ans <- c(5.4, 3.9, 1.7, 0.4) 10 | 11 | res <- nairis %>% impute_max(1:4) 12 | res %>% .[3,1:4] %>% expect_equivalent(ans) 13 | 14 | res <- nairis %>% impute_max_at( .vars=c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ) 15 | res %>% .[3,1:4] %>% expect_equivalent(ans) 16 | 17 | expect_error(res <- nairis %>% impute_max_all) 18 | # res %>% .[3,1:4] %>% expect_equivalent(ans) 19 | 20 | nairis %>% impute_max_if(is.numeric) 21 | res %>% .[3,1:4] %>% expect_equivalent(ans) 22 | 23 | 24 | }) 25 | 26 | -------------------------------------------------------------------------------- /tests/testthat/test-impute_mean.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | 4 | data("nairis") 5 | 6 | context( ".. impute_mean") 7 | test_that("impute_mean", { 8 | 9 | ans <- c(5,3.42,1.48,0.24) 10 | 11 | res <- nairis %>% impute_mean(1:4) 12 | res %>% .[3,1:4] %>% expect_equivalent(ans) 13 | 14 | res <- nairis %>% impute_mean_at( .vars=c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ) 15 | res %>% .[3,1:4] %>% expect_equivalent(ans) 16 | 17 | expect_warning(res <- nairis %>% impute_mean_all) 18 | res %>% .[3,1:4] %>% expect_equivalent(ans) 19 | 20 | nairis %>% impute_mean_if(is.numeric) 21 | res %>% .[3,1:4] %>% expect_equivalent(ans) 22 | 23 | 24 | }) 25 | 26 | -------------------------------------------------------------------------------- /tests/testthat/test-impute_median.R: -------------------------------------------------------------------------------- 1 | 2 | data("nairis") 3 | 4 | context( ".. impute_median") 5 | test_that("impute_median", { 6 | 7 | ans <- c(5, 3.5, 1.4, 0.2) 8 | 9 | res <- nairis %>% impute_median(1:4) 10 | res %>% .[3,1:4] %>% expect_equivalent(ans) 11 | 12 | res <- nairis %>% impute_median_at( .vars=c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ) 13 | res %>% .[3,1:4] %>% expect_equivalent(ans) 14 | 15 | expect_error(res <- nairis %>% impute_median_all) 16 | # res %>% .[3,1:4] %>% expect_equivalent(ans) 17 | 18 | nairis %>% impute_median_if(is.numeric) 19 | res %>% .[3,1:4] %>% expect_equivalent(ans) 20 | 21 | 22 | }) 23 | 24 | -------------------------------------------------------------------------------- /tests/testthat/test-impute_mode.R: -------------------------------------------------------------------------------- 1 | library(testthat) 2 | library(magrittr) 3 | library(tidyimpute) 4 | 5 | data("nairis") 6 | 7 | context( ".. impute_mode") 8 | test_that("impute_mode", { 9 | 10 | ans <- c(4.6,3,1.4,0.2) 11 | 12 | res <- nairis %>% impute_mode(1:4) 13 | res %>% .[3,1:4] %>% expect_equivalent(ans) 14 | 15 | res <- nairis %>% impute_mode_at( .vars=c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ) 16 | res %>% .[3,1:4] %>% expect_equivalent(ans) 17 | 18 | expect_error(res <- nairis %>% impute_mode_all) 19 | res %>% .[3,1:4] %>% expect_equivalent(ans) 20 | 21 | nairis %>% impute_mode_if(is.numeric) 22 | res %>% .[3,1:4] %>% expect_equivalent(ans) 23 | 24 | 25 | }) 26 | 27 | -------------------------------------------------------------------------------- /tests/testthat/test-impute_zero.R: -------------------------------------------------------------------------------- 1 | library(magrittr) 2 | 3 | 4 | data("nairis") 5 | 6 | context( ".. impute_zero") 7 | test_that("impute_zero", { 8 | 9 | ans <- rep(0.0,4) 10 | 11 | res <- nairis %>% impute_zero(1:4) 12 | res %>% .[3,1:4] %>% expect_equivalent(ans) 13 | 14 | res <- nairis %>% impute_zero_at( .vars=c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") ) 15 | res %>% .[3,1:4] %>% expect_equivalent(ans) 16 | 17 | # expect_warning( 18 | res <- nairis %>% impute_zero_all 19 | #) 20 | res %>% .[3,1:4] %>% expect_equivalent(ans) 21 | 22 | nairis %>% impute_zero_if(is.numeric) 23 | res %>% .[3,1:4] %>% expect_equivalent(ans) 24 | 25 | 26 | }) 27 | 28 | -------------------------------------------------------------------------------- /tidyimpute.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | BuildType: Package 16 | PackageInstallArgs: --no-multiarch --with-keep.source 17 | --------------------------------------------------------------------------------