# File src/library/stats/R/nafns.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2018 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ na.pass <- function(object, ...) object na.action <- function(object, ...) UseMethod("na.action") na.action.default <- function(object, ...) { if(is.list(object) && "na.action" %in% names(object)) object[["na.action"]] else attr(object, "na.action") } na.fail <- function(object, ...) UseMethod("na.fail") na.fail.default <- function(object, ...) { ok <- complete.cases(object) if(all(ok)) object else stop("missing values in object") } na.omit <- function(object, ...) UseMethod("na.omit") na.omit.default <- function(object, ...) { ## only handle vectors and matrices if (!is.atomic(object)) return(object) d <- dim(object) if (length(d) > 2L) return(object) omit <- seq_along(object)[is.na(object)] if (length(omit) == 0L) return(object) if (length(d)){ omit <- unique(((omit-1) %% d[1L]) + 1L) nm <- rownames(object) object <- object[-omit, , drop=FALSE] } else { nm <- names(object) object <- object[-omit] } if (any(omit > 0L)) { names(omit) <- nm[omit] attr(omit, "class") <- "omit" attr(object, "na.action") <- omit } object } na.omit.data.frame <- function(object, ...) { ## Assuming a data.frame like object n <- length(object) omit <- logical(nrow(object)) vars <- seq_len(n) for(j in vars) { x <- object[[j]] if(!is.atomic(x)) next ## variables are assumed to be either some sort of matrix, numeric,... x <- is.na(x) d <- dim(x) if(is.null(d) || length(d) != 2L) omit <- omit | x else # matrix for(ii in 1L:d[2L]) omit <- omit | x[, ii] } xx <- object[!omit, , drop = FALSE] if (any(omit > 0L)) { temp <- setNames(seq(omit)[omit], attr(object, "row.names")[omit]) attr(temp, "class") <- "omit" attr(xx, "na.action") <- temp } xx } na.exclude <- function(object, ...) UseMethod("na.exclude") na.exclude.default <- function(object, ...) { ## only handle vectors and matrices if (!is.atomic(object)) return(object) d <- dim(object) if (length(d) > 2L) return(object) omit <- seq_along(object)[is.na(object)] if (length(omit) == 0L) return(object) if (length(d)){ omit <- unique(((omit-1) %% d[1L]) + 1L) nm <- rownames(object) object <- object[-omit, , drop=FALSE] } else { nm <- names(object) object <- object[-omit] } if (any(omit > 0L)) { names(omit) <- nm[omit] attr(omit, "class") <- "exclude" attr(object, "na.action") <- omit } object } na.exclude.data.frame <- function(object, ...) { ## Assuming a data.frame like object n <- length(object) omit <- logical(nrow(object)) vars <- seq_len(n) for(j in vars) { x <- object[[j]] if(!is.atomic(x)) next ## variables are assumed to be either some sort of matrix, numeric,... x <- is.na(x) d <- dim(x) if(is.null(d) || length(d) != 2L) omit <- omit | x else # matrix for(ii in 1L:d[2L]) omit <- omit | x[, ii] } xx <- object[!omit, , drop = FALSE] if (any(omit > 0L)) { temp <- setNames(seq(omit)[omit], attr(object, "row.names")[omit]) attr(temp, "class") <- "exclude" attr(xx, "na.action") <- temp } xx } naresid <- function(omit, x, ...) UseMethod("naresid") naresid.default <- function(omit, x, ...) x ## naresid.exclude (same as napredict...) *reconstruct* original size values: naresid.exclude <- function(omit, x, ...) { if (length(omit) == 0 || !is.numeric(omit)) stop("invalid argument 'omit'") ## the next line copes with calls from older versions of weights.default. if (is.null(x)) return(x) n <- NROW(x) keep <- rep.int(NA, n+length(omit)) keep[-omit] <- 1L:n if (is.matrix(x)) { x <- x[keep, , drop=FALSE] temp <- rownames(x) if (length(temp)) { temp[omit] <- names(omit) rownames(x) <- temp } } else if(is.array(x) && length(d <- dim(x)) > 2L) { ## e.g. inside lm.influence() for mlm, when x = coefficients: n x p x q x <- x[keep, , , drop=FALSE] temp <- (dn <- dimnames(x))[[1L]] if (!is.null(temp)) { temp[omit] <- names(omit) dimnames(x)[[1L]] <- temp } } else {# vector *or* data.frame ! x <- x[keep] temp <- names(x) if (length(temp)) { temp[omit] <- names(omit) names(x) <- temp } } x } naprint <- function(x, ...) UseMethod("naprint") naprint.default <- function(x, ...) return("") naprint.exclude <- naprint.omit <- function(x, ...) sprintf(ngettext(n <- length(x), "%d observation deleted due to missingness", "%d observations deleted due to missingness"), n) napredict <- function(omit, x, ...) UseMethod("napredict") napredict.default <- function(omit, x, ...) x napredict.exclude <- function(omit, x, ...) naresid.exclude(omit, x)