Thank you for the answers.  Checking for NAs using any() will help.
I just thought it was worth mentioning because the behaviour of data
frames (which throw an error) is different to the behaviour of matrices
(which don't), and that might not be expected.  

mat <- matrix(c(1,1,1,1),nrow=2,ncol=2)
mat[is.na(mat)] <- 0

mat <- matrix(c(1,1,1,NA),nrow=2,ncol=2)
mat[is.na(mat)] <- 0

-----Original Message-----
From: Prof Brian Ripley [mailto:[EMAIL PROTECTED] 
Sent: 14 January 2005 11:57
To: michael watson (IAH-C)
Cc: [email protected]
Subject: Re: [R] Replacing NAs in a data frame using is.na() fails if
there are no NAs


On Fri, 14 Jan 2005, michael watson (IAH-C) wrote:

> Hi
>
> This is a difference between the way matrices and data frames work I 
> guess.  I want to replace the NA values in a data frame by 0, and the 
> code works as long as the data frame in question actually includes an 
> NA value.  If it doesn't, there is an error:
>
> df <- data.frame(c1=c(1,1,1),c2=c(2,2,NA))
> df[is.na(df)] <- 0
> df
>
> df <- data.frame(c1=c(1,1,1),c2=c(2,2,2))
> df[is.na(df)] <- 0
> Df
>
> Any help would be appreciated.  I could just convert the data frame to

> a matrix, execute the code, then convert it back to a data frame, but 
> that appears long winded.

As always, look at the objects:

> is.na(df)
      c1    c2
1 FALSE FALSE
2 FALSE FALSE
3 FALSE FALSE

so there is nothing to replace by 0.

What you should have is

ind <- is.na(df)
df[ind] <- rep(0, sum(ind))

to give the right number of replacements.

-- 
Brian D. Ripley,                  [EMAIL PROTECTED]
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to