Skip to content

Odd behavior of a function within apply

4 messages · Andrew Simmons, Erin Hodgess

#
Hello!

I have the following data.frame
 dput(test1.df[1:10,8:10])
structure(list(X1_1_HZP1 = c(48160L, 48198L, 80027L, 48161L,
NA, 48911L, NA, 48197L, 48021L, 11355L), X1_1_HBM1_mon = c("December",
"June", "August", "", "", "August", "April", "February", "",
"December"), X1_1_HBM1_yr = c(2014L, 2018L, 2016L, NA, NA, 1985L,
2019L, 1993L, NA, 1990L)), row.names = c(NA, 10L), class = "data.frame")

And the following function:
function (x)
{
    if (typeof(x) == "integer")
        y <- sum(is.na(x))
    if (typeof(x) == "character")
        y <- sum(x == "")
    return(y)
}
When I use the apply function with count1a, I get the following:
 apply(test1.df[1:10,8:10],2,count1a)
    X1_1_HZP1 X1_1_HBM1_mon  X1_1_HBM1_yr
           NA             3            NA
However, when I do use columns 8 and 10, I get the correct response:
 apply(test1.df[1:10,c(8,10)],2,count1a)
   X1_1_HZP1 X1_1_HBM1_yr
           2            3
I am really baffled.  If I use count1a on a single column, it works fine.

Any suggestions much appreciated.
Thanks,
Sincerely,
Erin


Erin Hodgess, PhD
mailto: erinm.hodgess at gmail.com
#
When you use apply, it converts the input to an array, so all of the
integer columns in your data frame are converted to character class. I
would use lapply, sapply, or vapply instead to do this, I think you just
need to remove the "MARGIN" argument.
On Mon, Aug 8, 2022, 13:25 Erin Hodgess <erinm.hodgess at gmail.com> wrote:

            

  
  
#
Great, thank you so much!


Erin Hodgess, PhD
mailto: erinm.hodgess at gmail.com
On Mon, Aug 8, 2022 at 1:29 PM Andrew Simmons <akwsimmo at gmail.com> wrote:

            

  
  
#
lapply worked perfectly!

Erin Hodgess, PhD
mailto: erinm.hodgess at gmail.com
On Mon, Aug 8, 2022 at 1:29 PM Andrew Simmons <akwsimmo at gmail.com> wrote: