Skip to content

Odd behavior of a function within apply

8 messages · John Fox, Erin Hodgess, David L Carlson +1 more

#
Dear Erin,

The problem is that the data frame gets coerced to a character matrix, 
and the only column with "" entries is the 9th (the second one you 
supplied):

as.matrix(test1.df)
    X1_1_HZP1 X1_1_HBM1_mon X1_1_HBM1_yr
1  "48160"   "December"    "2014"
2  "48198"   "June"        "2018"
3  "80027"   "August"      "2016"
4  "48161"   ""            NA
5  NA        ""            NA
6  "48911"   "August"      "1985"
7  NA        "April"       "2019"
8  "48197"   "February"    "1993"
9  "48021"   ""            NA
10 "11355"   "December"    "1990"

(Here, test1.df only contains the three columns you provided.)

A solution is to use sapply:

 > sapply(test1.df, count1a)
     X1_1_HZP1 X1_1_HBM1_mon  X1_1_HBM1_yr
             2             3             3


I hope this helps,
  John
On 2022-08-08 1:22 p.m., Erin Hodgess wrote:
#
Awesome, thanks so much!!

Erin Hodgess, PhD
mailto: erinm.hodgess at gmail.com
On Mon, Aug 8, 2022 at 1:38 PM John Fox <jfox at mcmaster.ca> wrote:

            

  
  
#
OK.  I'm back again.

So my test1.df is 236x390

If I put in the following:
 lapply(test1.df,count1a)
Error in FUN(X[[i]], ...) : object 'y' not found
Error in FUN(X[[i]], ...) : object 'y' not found
Error in FUN(X[[i]], ...) : object 'y' not found
What am I doing wrong, please?
Thanks,
Erin


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

            

  
  
#
Nailed it!

There were a few "logical" columns in my data.frame.

Thanks for all of the help!
Sincerely,
Erin

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

            

  
  
#
Could you have columns that are not character or integer so that y is never
defined in the function?

count1a(1:5/3)
Error in count1a(1:5/3) : object 'y' not found

David Carlson
On Mon, Aug 8, 2022 at 1:35 PM Erin Hodgess <erinm.hodgess at gmail.com> wrote:

            

  
  
#
My ?count1a? function was only looking for types of integers and
characters.  There were a few logical types, which were the source of the
error.

Thanks,
Erin
On Tue, Aug 9, 2022 at 11:33 AM David Carlson <dcarlson at tamu.edu> wrote:

            
Erin Hodgess, PhD
mailto: erinm.hodgess at gmail.com
#
Yes, David, the function described seems to insist it be of type integer or type character and if the type was double or others might well fail as y would never be initialized.

The goal seems to be to count how many "missing" values are found as in NA if a numeric type or an empty string if character.

But you can have some form of NA in all kinds of object types including character as in this construct:
[1] "a"   NA    ""    "b"   "NA)"

The above has three useless elements if both NA and "" are considered empty. So logically the condition could be to count NA and IF it is of type character, also count "". 

So rather than play games testing not just is.integer, is.double (or just is.numeric) as well as is.logical and is.raw, all the above can be tested with is.na() first to add up how many Na they contain. If then it is of type character, you can add any blank strings. 

So the algorithm would initialize y to sum(is.na(vec)) and then if the vec is character, add the sum of how many empty strings.

Alternately, the function should deal with what it wants to do if any other type is encountered. You can internally converts many things to integer or character and then operate on them. Or you can return a zero or raise an alarm when given something else.

In this case, simply setting y to zero before using it would make it defined and avoid the error, albeit report nothing found if it was a double or Boolean vector even if it did contain NA.


-----Original Message-----
From: R-help <r-help-bounces at r-project.org> On Behalf Of David Carlson via R-help
Sent: Tuesday, August 9, 2022 11:33 AM
To: Erin Hodgess <erinm.hodgess at gmail.com>
Cc: r-help at r-project.org
Subject: Re: [R] Odd behavior of a function within apply

Could you have columns that are not character or integer so that y is never defined in the function?

count1a(1:5/3)
Error in count1a(1:5/3) : object 'y' not found

David Carlson
On Mon, Aug 8, 2022 at 1:35 PM Erin Hodgess <erinm.hodgess at gmail.com> wrote:

            
______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
#
Avi, that?s great!

Thanks
On Tue, Aug 9, 2022 at 12:56 PM <avi.e.gross at gmail.com> wrote: