Learn R Programming

expss (version 0.10.5)

if_na: Replace values with NA and vice-versa

Description

  • if_na replaces NA values in vector/data.frame/matrix/list with supplied value. For single value argument label can be provided with label argument. If replacement value is vector then if_na uses for replacement values from appropriate positions. An opposite operation is na_if.

  • na_if replaces values with NA in vector/data.frame/matrix/list. Another alias for this is mis_val.

  • valid returns logical vector which indicate the presence of at least one not-NA value in row. For vector or single column data.frame result is the same as with complete.cases. There is a special case for data.frame of class dichotomy. In this case result indicate the presence of at least one 1 in a row.

Usage

if_na(x, value, label = NULL)

if_na(x, label = NULL) <- value

x %if_na% value

na_if(x, value, with_labels = FALSE)

na_if(x, with_labels = FALSE) <- value

x %na_if% value

mis_val(x, value, with_labels = FALSE)

mis_val(x, with_labels = FALSE) <- value

valid(x)

Arguments

x

vector/matrix/data.frame/list

value

single value, vector of the same length as number of rows in x, or function (criteria) for na_if. See recode for details.

label

a character of length 1. Label for value which replace NA.

with_labels

logical. FALSE by default. Should we also remove labels of values which we recode to NA?

Value

object of the same form and class as x. valid returns logical vector.

Format

An object of class character of length 1.

Examples

Run this code
# NOT RUN {
# simple case
a = c(NA, 2, 3, 4, NA)
if_na(a, 99)

# the same result
a %if_na% 99

# with label
a = c(NA, 2, 3, 4, NA)
if_na(a, 99, label = "Hard to say")

# in-place replacement. The same result:
if_na(a, label = "Hard to say") = 99 
a # c(99, 2, 3, 4, 99)

# replacement with values from other variable
a = c(NA, 2, 3, 4, NA)
b = 1:5
if_na(a, b)

# replacement with group means
# make data.frame 
set.seed(123)
group = sample(1:3, 30, replace = TRUE)
param = runif(30)
param[sample(30, 10)] = NA # place 10 NA's
df = data.frame(group, param)

# replace NA's with group means
if_na(df$param) = window_fun(df$param, df$group, mean_col)
df

######################
### na_if examples ###
######################

a = c(1:5, 99)
# 99 to NA
na_if(a, 99)    # c(1:5, NA)

a %na_if% 99    # same result

# values which greater than 4 to NA
na_if(a, gt(4)) # c(1:4, NA, NA)

# alias 'mis_val', with_labels = TRUE
a = c(1, 1, 2, 2, 99)
val_lab(a) = c(Yes = 1, No = 2, "Hard to say" = 99)
mis_val(a, 99, with_labels = TRUE)

set.seed(123)
dfs = data.frame(
      a = c("bad value", "bad value", "good value", "good value", "good value"),
      b = runif(5)
)

# rows with 'bad value' will be filled with NA
# logical argument and recycling by columns
na_if(dfs, dfs$a=="bad value")

a = rnorm(50)
# values greater than 1 or less than -1 will be set to NA
# special functions usage
na_if(a, lt(-1) | gt(1))

# values inside [-1, 1] to NA
na_if(a, -1 %thru% 1)
# }

Run the code above in your browser using DataLab