Apologies to list: Should have "replied to all". -- DW
Begin forwarded message: > From: David Winsemius <dwinsem...@comcast.net> > Date: August 1, 2009 3:02:58 PM EDT > To: Meenu Sahi <meenus...@gmail.com> > Subject: Re: [R] Add columns in a dataframe and fill them from > another table according to a criteria > > > On Aug 1, 2009, at 1:43 PM, Meenu Sahi wrote: > >> Dear R users >> My apologizes for not writing in the correct format due to my >> ignorance. In the future I will write more clearly. I hope to >> contribute to the R community in the process of picking up the >> language professionally. >> I have now written the R code which is attached in a notepad file. >> I've simplified my problem in an example of, table pstate which >> contains the probabilities of getting certain changes in the four >> different states and a dataframe mydata4 which contains all the >> changes connected to the four different states. I would like to add >> the probabilities into mydata4 after matching for the change and >> the state. >> Everything before ##### output can be copy pasted in the R window. >> The desired output is written after ###### OUTPUT >> Must I write an if else or can I do it in an easier way? >> Your help is greatly appreciated ! Many thanks for your patience. > > You need to figure out how to send mail to the list with plain text. > But I suspect you did successfully get the attchment through to the > audience. > > I did not like the ordering of the PStates in your new target > dataframe so I changed it to fit my(and your) purposes. > > > Change<-c("b","a","b","c","d","a") > > State<-c("State1","State4","State2","State3","State1","State3") > > > > mydata4<-data.frame(Change,State) > > mydata4<-data.frame(mydata4, > + PState1=NA, > + PState2=NA, > + PState3=NA, > + PState4=NA > + ) > > mydata4 > Change State PState1 PState2 PState3 PState4 > 1 b State1 NA NA NA NA > 2 a State4 NA NA NA NA > 3 b State2 NA NA NA NA > 4 c State3 NA NA NA NA > 5 d State1 NA NA NA NA > 6 a State3 NA NA NA NA > > Note that str(pstate shows that State is a factor which becomes > important. > > This now effects the desired transformation: > > for (i in 1:length(mydata4) ) > { mydata4[i, as.numeric( mydata4[i, "State"])+2 ] <- > #assign to the i-th row, State + 2 column in > mydata4 ... > pstate[ mydata4[i, "Change"], as.numeric( mydata4[i, > "State"])+1 ] } > #... the value of i-th row, State+1 column of pstate > > > mydata4 > Change State PState1 PState2 PState3 PState4 > 1 b State1 Pb1 <NA> <NA> <NA> > 2 a State4 <NA> <NA> <NA> Pa4 > 3 b State2 <NA> Pb2 <NA> <NA> > 4 c State3 <NA> <NA> Pc3 <NA> > 5 d State1 Pd1 <NA> <NA> <NA> > 6 a State3 <NA> <NA> Pa3 <NA> > > The main non-obvious "trick" is the as.numeric( mydata4[i, > "State"]) bit. as.numeric() when applied to a factor results in a > numeric offset derived from the factor coding rather than using the > level names. I suppose I could have left the PState<n>'s in the > original order but then I would have been subtracting them from 7 to > get the proper column number. Seemed even less understandable > >> >> Regards >> Meenu >> >> On Sat, Aug 1, 2009 at 9:43 PM, David Winsemius <dwinsem...@comcast.net >> > wrote: >> >> On Aug 1, 2009, at 9:52 AM, Meenu Sahi wrote: >> >> Deare R users >> >> I am new to R. >> What I want to do is explained below;- >> I have table called States.Prob which is given below:- >> This table gives the probabilities of the changes in the swap curve >> depending on the state of the swap curve. I want to put these >> probabilities >> in my dataframe mydata(given after the prob table). >> Prob of States >> Changes State1 State2 State3 State4 >> a Pa1 Pa2 Pa3 Pa4 >> b Pb1 Pb2 Pb3 Pb4 >> c Pc1 Pc2 Pc3 Pc4 >> d Pd1 Pd2 Pd3 Pd4 >> >> and I have a dataframe(with 93 rows) called mydata part of which(6 >> rows) is >> given below where I want to fill in the last four columns with >> probabilities >> taken from States.Prob according to the change and state in mydata4:- >> Change State PState1 PState2 PState3 PState4 >> 1 b State1 Pb1 >> 2 a State4 Pa4 >> 3 b State2 Pb2 >> 4 c State3 Pc3 >> 5 d State1 Pd1 >> 6 a State3 Pa3 >> >> What I want to do is highlighted in Red. >> How can I do this easily? >> >> You may have seen it in red, but we don't, ....and I, at least, >> cannot figure out what you intend. (Per the Posting Guide, which >> you have obviously not yet read, you need to compose your question >> in plain old monochromatic text and change your mail client so it >> posts in plain text.) >> >> If looking at the help pages for stack() and reshape() does not >> offer useful information and worked examples that meet your needs >> then: >> >> An approach that would make you more populat in these parts would >> be to make a simpler example, composed in syntactically correct R, >> that is complete in itself, and can pasted into an R session. >> Indicate what you intend as output from this simpler input. >> >> Perhaps.... >> >> > pstate <- read.table(textConnection("Changes State1 State2 >> State3 State4 >> >> + a Pa1 Pa2 Pa3 Pa4 >> + b Pb1 Pb2 Pb3 Pb4 >> + c Pc1 Pc2 Pc3 Pc4 >> + d Pd1 Pd2 Pd3 Pd4"), header=TRUE, >> as.is=TRUE) >> >> ?stack >> >> > data.frame(Change=pstate[,1], >> prstate =stack(pstate[2:5])$values, >> state=stack(pstate[2:5])$ind ) >> >> #first column is only 4 elements long, but will get recycled >> # second retreives the probabilities and may need to have >> as.numeric( ) wrapped around it if they really are numeric. >> # third returns what started out as column names. >> >> Change prstate state >> 1 a Pa1 State1 >> 2 b Pb1 State1 >> 3 c Pc1 State1 >> 4 d Pd1 State1 >> 5 a Pa2 State2 >> 6 b Pb2 State2 >> 7 c Pc2 State2 >> 8 d Pd2 State2 >> 9 a Pa3 State3 >> 10 b Pb3 State3 >> 11 c Pc3 State3 >> 12 d Pd3 State3 >> 13 a Pa4 State4 >> 14 b Pb4 State4 >> 15 c Pc4 State4 >> 16 d Pd4 State4 >> >> >> Many thanks for your time. >> >> kind regards >> Meenu >> P.S. Thanks for your reply John. I've tried to put only the >> relevant columns >> of the dataframe. Hope its more clear now. >> >> \\\\\\\\\\\\\\\\\\////////////////// >> [[alternative HTML version deleted]] >> >> ^^^^^^^^^^^^^^Note: ^^^^^^^^^^^^^^^^^^^^^^ >> >> David Winsemius, MD >> Heritage Laboratories >> West Hartford, CT >> >> >> <Input and Output.txt> > > David Winsemius, MD > Heritage Laboratories > West Hartford, CT > David Winsemius, MD Heritage Laboratories West Hartford, CT [[alternative HTML version deleted]] ______________________________________________ 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.