On 2011-07-25 15:48, William Dunlap wrote:
-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
Behalf Of David Winsemius
Sent: Monday, July 25, 2011 3:39 PM
To: Anthony Damico
Cc: r-help@r-project.org
Subject: Re: [R] Recoding Multiple Variables in a Data Frame in One Step


On Jul 21, 2011, at 8:06 PM, Anthony Damico wrote:

Hi, I can't for the life of me find how to do this in base R, but
I'd be
surprised if it's not possible.

I'm just trying to replace multiple columns at once in a data frame.

#load example data
data(api)

#this displays the three columns and eight rows i'd like to replace
apiclus1[ apiclus1$meals>  98 , c( "pcttest" , "api00" ,
"sch.wide" ) ]


#the goal is to replace pcttest with 100, api100 with NA, and
sch.wide with
"Maybe"

#this doesn't work--
apiclus1[ apiclus1$meals>  98 , c( "pcttest" , "api00" ,
"sch.wide" ) ]<-
c( 100 , NA , "Maybe" )

Try list(pcttest=100, api00=NA, sch.wide="Maybe") instead
of c(100, NA, "Maybe") as the new value.

Here is a self-contained example
  >  df<- data.frame(Size=sin(1:10), Name=state.name[11:20], Value=11:20, 
stringsAsFactors=FALSE)
  >  df[df$Size<0, c("Name", "Value")]<- list(Name="JUNK", Value=-99)
  >  df
           Size      Name Value
  1   0.8414710    Hawaii    11
  2   0.9092974     Idaho    12
  3   0.1411200  Illinois    13
  4  -0.7568025      JUNK   -99
  5  -0.9589243      JUNK   -99
  6  -0.2794155      JUNK   -99
  7   0.6569866  Kentucky    17
  8   0.9893582 Louisiana    18
  9   0.4121185     Maine    19
  10 -0.5440211      JUNK   -99

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

Here's another solution, using within():

  within(df, {Name[Size<0] <- 'JUNK'
             Value[Size<0] <- -99})

But I like William's simple list() solution.

Peter Ehlers



#the results replace downward instead of across
apiclus1[ apiclus1$meals>  98 , c( "pcttest" , "api00" ,
"sch.wide" ) ]

If I had noted that I would have tried this:

apiclus1[ apiclus1$meals>  98 , rep( c( "pcttest" , "api00" ,
"sch.wide" ),
                                         each =  sum(apiclus1$meals>  98)
                                      ) ]

Should be pretty easy to test, but since _you_ are the one responsible
for providing examples for testing when posting to rhelp,  I am going
to throw an untested theory back at you.



I know I can do this with a few more steps (like one variable at a
time or
by counting the number of rows to replace and then using rep() ..but
I'm
hoping there's a quicker way?


Thanks!!

Anthony Damico


David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@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.

______________________________________________
R-help@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.

______________________________________________
R-help@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.

Reply via email to