R programming - pmax with data frame

I tried to use the pmax function in my program. I had a frame of given numbers, and I tried to compare it with one number. The output file is NA.

I realized that the data frame does not work with pmax, so I changed the data frame to a matrix. And it worked. I was curious why the data frame was being returned by NA. Does it have anything to do with recycling?

the code: -

mat <- matrix(runif(500), nrow = 20, ncol = 5)
df <- as.data.frame(mat)


pmax(mat, .5) # No NA's

pmax(df, .5) # Many NA's
+4
source share
1 answer

This is one of the problems when the replication of the value in the second argument is not completely processed, i.e. depends on the number of columns. This may be the reason.

rep(0.5, ncol(df))[df < 0.5]
#[1] 0.5 0.5  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#[41]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

, 0.5 , TRUE df < 0.5, , 0,5 .

, pmax,

mmm[change] <- each[change]

. print "" " []. , print

pmax2 <- function (..., na.rm = FALSE) 
{
    elts <- list(...)
    if (length(elts) == 0L) 
        stop("no arguments")
    if (all(vapply(elts, function(x) is.atomic(x) && !is.object(x), 
        NA))) {
        mmm <- .Internal(pmax(na.rm, ...))
        mostattributes(mmm) <- attributes(elts[[1L]])
    }
    else {
        mmm <- elts[[1L]]
        has.na <- FALSE
        as <- methods::as
        asL <- function(x) if (isS4(x)) 
            as(x, "logical")
        else x
        for (each in elts[-1L]) {
            l1 <- length(each)
            l2 <- length(mmm)
            if (l2 && (l2 < l1 || !l1)) {
                if (l1%%l2) 
                  warning("an argument will be fractionally recycled")
                mmm <- rep(mmm, length.out = l1)
            }
            else if (l1 && (l1 < l2 || !l2)) {
                if (l2%%l1) 
                  warning("an argument will be fractionally recycled")
                each <- rep(each, length.out = l2)
            }
            na.m <- is.na(mmm)
            na.e <- is.na(each)
            if (has.na || (has.na <- any(na.m) || any(na.e))) {
                if (any(na.m <- asL(na.m))) 
                  mmm[na.m] <- each[na.m]
                if (any(na.e <- asL(na.e))) 
                  each[na.e] <- mmm[na.e]
            }
            nS4 <- !isS4(mmm)
            if (isS4(change <- mmm < each) && (nS4 || !isS4(each))) 
                change <- as(change, "logical")
            change <- change & !is.na(change)
            print(change)
            mmm[change] <- each[change]
            print(each)
            print(each[change])
            if (has.na && !na.rm) 
                mmm[na.m | na.e] <- NA
            if (nS4) 
                mostattributes(mmm) <- attributes(elts[[1L]])
        }
    }
    mmm
}

print pmax2 'df'

invisible(pmax2(df, 0.5))
#       V1    V2    V3    V4    V5
# [1,]  TRUE  TRUE  TRUE  TRUE FALSE
# [2,]  TRUE FALSE  TRUE  TRUE  TRUE
# [3,] FALSE FALSE  TRUE  TRUE FALSE
# [4,] FALSE  TRUE  TRUE  TRUE  TRUE
# [5,] FALSE  TRUE  TRUE FALSE  TRUE
# [6,] FALSE FALSE  TRUE  TRUE  TRUE
# [7,]  TRUE  TRUE  TRUE FALSE  TRUE
# [8,] FALSE FALSE  TRUE FALSE FALSE
# [9,] FALSE FALSE  TRUE FALSE  TRUE
#[10,]  TRUE  TRUE  TRUE  TRUE FALSE
#[11,] FALSE  TRUE  TRUE  TRUE  TRUE
#[12,]  TRUE  TRUE FALSE  TRUE FALSE
#[13,] FALSE  TRUE  TRUE  TRUE FALSE
#[14,] FALSE  TRUE FALSE FALSE  TRUE
#[15,]  TRUE FALSE FALSE FALSE  TRUE
#[16,] FALSE  TRUE FALSE  TRUE FALSE
#[17,]  TRUE FALSE  TRUE FALSE FALSE
#[18,]  TRUE FALSE  TRUE FALSE  TRUE
#[19,] FALSE FALSE  TRUE  TRUE  TRUE
#[20,]  TRUE FALSE  TRUE FALSE  TRUE
#[1] 0.5 0.5 0.5 0.5 0.5
# [1] 0.5 0.5  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#[41]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

, , rep, .

a matrix - if/else

invisible(pmax2(mat, 0.5))


pmax matrix , data.frame . unlist data.frame matrix

all.equal(c(pmax(mat, .5)), pmax(unlist(df), .5), check.attributes = FALSE)
#[1] TRUE

set.seed(24)
mat <- matrix(runif(500), nrow = 20, ncol = 5)
df <- as.data.frame(mat)
+3

Source: https://habr.com/ru/post/1689840/


All Articles