[R] using ifelse to remove NA's from specific columns of a data frame containing strings and numbers

arun smartpink111 at yahoo.com
Thu Nov 15 21:21:50 CET 2012


HI,

But, this replace second column NAs to 1.  May be, the na.replace() should be applied to df1[,-1]

df1<-read.table(text="
col1 col2 col3
A   15.5   8.5
A   8.5    7.5
A   NA     NA
B   8.0   6.0
B   NA     NA
B   9.0   10.0
",sep="",header=TRUE,stringsAsFactors=FALSE)
df2<-df1[,-1]
na.replace<-seq(1:ncol(df2))-1
df2[,names(df2)]<-sapply(1:dim(df2)[2],function(ii){ifelse(is.na(df2[,ii]),na.replace[ii],df2[,ii])})
df2$col1<-df1$col1
df2[order(names(df2))]
#  col1 col2 col3
#1    A 15.5  8.5
#2    A  8.5  7.5
#3    A  0.0  1.0
#4    B  8.0  6.0
#5    B  0.0  1.0
#6    B  9.0 10.0
A.K.





----- Original Message -----
From: soon yi <soon.yi at ymail.com>
To: r-help at r-project.org
Cc: 
Sent: Thursday, November 15, 2012 2:29 PM
Subject: Re: [R] using ifelse to remove NA's from specific columns of a data frame containing strings and numbers

#Data
df<-data.frame(id=letters[1:10],var1=rnorm(10,10,5),var2=rnorm(10,5,2),var3=rnorm(10,1,1))
#Missing
df$var1[2]<-df$var2[c(2,6)]<-df$var3[c(2,5)]<-NA

na.replace<-seq(1:ncol(df))-1

df[,names(df)]<-sapply(1:dim(df)[2], function(ii)
{ifelse(is.na(df[,ii]),na.replace[ii],df[,ii])} )




David Romano-2 wrote
> Hi everyone,
> 
> I have a data frame one of whose columns is a character vector and the
> rest
> are numeric, and in debugging a script, I noticed that an ifelse call
> seems
> to be coercing the character column to a numeric column, and producing
> unintended values as a result.   Roughly, here's what I tried to do:
> 
> df: a data frame with, say, the first column as a character column and the
> second and third columns numeric.
> 
> also: NA's occur only in the numeric columns, and if they occur in one,
> they occur in the other as well.
> 
> I wanted to replace the NA's in column 2 with 0's and the ones in column 3
> with 1's, so first I did this:
> 
>> na.replacements <-ifelse(col(df)==2,0,1).
> 
> Then I used a second ifelse call to try to remove the NA's as I wanted,
> first by doing this:
> 
>> clean.df <- ifelse(is.na(df), na.replacements, df),
> 
> which produced a list of lists vaguely resembling df, with the NA's mostly
> intact, and so then I tried this:
> 
>> clean.df <- ifelse(is.na(df), na.replacements, unlist(df)),
> 
> which seems to work if all the columns are numeric, but otherwise changes
> strings to numbers.
> 
> I can't make sense of the help documentation enough to clear this up, but
> my guess is that the "yes" and "no" values passed to ifelse need to be
> vectors, in which case it seems I'll have to use another approach
> entirely,
> but even if is not the case and lists are acceptable, I'm not sure how to
> convert a mixed-mode data frame into a vector-like list of elements (which
> I would hope would work).
> 
> I'd be grateful for any suggestions!
> 
> Thanks,
> David Romano
> 
>     [[alternative HTML version deleted]]
> 
> ______________________________________________

> R-help@

>  mailing list
> 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.





--
View this message in context: http://r.789695.n4.nabble.com/using-ifelse-to-remove-NA-s-from-specific-columns-of-a-data-frame-containing-strings-and-numbers-tp4649599p4649642.html
Sent from the R help mailing list archive at Nabble.com.

______________________________________________
R-help at r-project.org mailing list
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.





More information about the R-help mailing list