[R] How to pass na.rm=T to a user defined function

Jun Shen jun.shen.ut at gmail.com
Sat Jul 30 02:08:11 CEST 2016


Thanks Jeff/David for the reply. I wasn't clear in the previous message.
the problem of using na.omit is it will omit the whole row where there is
at least one NA, even when some variables do have non-NA values.

For example: let's define a new function
N <- function(x) length(x[!is.na(x)])

test <-
data.frame(ID=1:100,CL=rnorm(100),V1=rnorm(100),V2=rnorm(100),ALPHA=rnorm(100))
test$CL[1] <- NA

do.stats(test, stats.func=c('mean','sd','median','min','max','N'),
summary.var=c('CL','V1', 'V2','ALPHA'))

gives

         mean    sd  median   min  max  N
CL    -0.0232 0.918 -0.0786 -2.14 3.14 99
V1    -0.0410 0.936 -0.1160 -2.86 2.67 99
V2    -0.1760 0.978 -0.1490 -2.31 2.15 99
ALPHA -0.1380 0.960 -0.2160 -2.41 2.20 99

there is one non-missing value in V1,V2 and ALPHA is omitted.



On Fri, Jul 29, 2016 at 2:29 AM, David Winsemius <dwinsemius at comcast.net>
wrote:

>
> > On Jul 28, 2016, at 7:37 PM, Jun Shen <jun.shen.ut at gmail.com> wrote:
> >
> > Because in reality the NA may appear in one variable but not others. For
> > example for ID=1, CL may be NA but not for others, For ID=2, V1 may be NA
> > etc. To keep all the IDs and all the variables in one data frame, it's
> > inevitable to see some NA
>
> That doesn't seem to acknowledge Newmiller's advice. In particular this
> would have seemed to an obvious response to that suggestion:
>
> do.stats <- function(data, stats.func, summary.var)
>           as.data.frame(signif(sapply(stats.func,function(func)
> mapply( func,  na.omit( data[summary.var]) )), 3))
>
>
> And please also heed the advice in the Posting Guide to use plain text.
>
> --
> David.
>
>
>
> >
> > On Thu, Jul 28, 2016 at 10:22 PM, Jeff Newmiller <
> jdnewmil at dcn.davis.ca.us>
> > wrote:
> >
> >> Why not remove it yourself before passing it to those functions?
> >> --
> >> Sent from my phone. Please excuse my brevity.
> >>
> >> On July 28, 2016 5:51:47 PM PDT, Jun Shen <jun.shen.ut at gmail.com>
> wrote:
> >>> Dear list,
> >>>
> >>> I write a small function to calculate multiple stats on multiple
> >>> variables
> >>> and export in a format exactly the way I want. Everything seems fine
> >>> until
> >>> NA appears in the data.
> >>>
> >>> Here is my function:
> >>>
> >>> do.stats <- function(data, stats.func, summary.var)
> >>>           as.data.frame(signif(sapply(stats.func,function(func)
> >>> mapply(func,data[summary.var])),3))
> >>>
> >>> A test dataset:
> >>> test <-
> >>
> >>>
> data.frame(ID=1:100,CL=rnorm(100),V1=rnorm(100),V2=rnorm(100),ALPHA=rnorm(100))
> >>>
> >>> a command like the following
> >>> do.stats(test, stats.func=c('mean','sd','median','min','max'),
> >>> summary.var=c('CL','V1', 'V2','ALPHA'))
> >>>
> >>> gives me
> >>>
> >>>        mean    sd  median   min  max
> >>> CL     0.1030 0.917  0.0363 -2.32 2.47
> >>> V1    -0.0545 1.070 -0.2120 -2.21 2.70
> >>> V2     0.0600 1.000  0.0621 -2.80 2.62
> >>> ALPHA -0.0113 0.919  0.0284 -2.35 2.31
> >>>
> >>>
> >>> However if I have a NA in the data
> >>> test$CL[1] <- NA
> >>>
> >>> The same command run gives me
> >>>        mean    sd  median   min  max
> >>> CL        * NA    NA      NA    NA   NA*
> >>> V1    -0.0545 1.070 -0.2120 -2.21 2.70
> >>> V2     0.0600 1.000  0.0621 -2.80 2.62
> >>> ALPHA -0.0113 0.919  0.0284 -2.35 2.31
> >>>
> >>> I know this is because those functions (mean, sd etc.) all have
> >>> na.rm=F by default. How can I
> >>>
> >>> pass na.rm=T to all these functions without manually redefining those
> >>> stats functions
> >>>
> >>> Appreciate any comment.
> >>>
> >>> Thanks for your help.
> >>>
> >>>
> >>> Jun
> >>>
> >>>      [[alternative HTML version deleted]]
> >>>
> >>> ______________________________________________
> >>> 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.
> >>
> >>
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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.
>
> David Winsemius
> Alameda, CA, USA
>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list