using ifelse to remove NA's from specific columns of a data frame containing strings and numbers
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.