|
Hi
Newbie question: I have a set of data frames that I want to do the same calculations on each. I've found out that I can put them in a list and loop through the list to do the calculation, but not put the results back into each data.frame.. For example three data frames cats, dogs, birds where >cats name eats_kg 1 bob 3 2 garfield 4 3 chuck 6 and dogs and birds are similar but not same length. On each data frame I now want to add a column with cost of food by calculating "eats_kg"*price of food. So question is, can I put all data frames into one loop which returns a new column for each? Ive tried MyList <- list(cast,dog,birds) for(i in 1:length(MyList)){ price <- as.data.frame(myList[i])[,2] * cost .. and then Im stuck. How can I put "price" back into each data frame? Thanks in advance. ______________________________________________ [hidden email] 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. |
|
Hi Jan,
You can do it in two ways. The simplest one is the following. The first option is to use $. Here is how: dogs <- data.frame(a = 1:10, b = 10:1) dogs$c <- dogs$a+dogs$b dogs The second way it to use ?within ----------------Contact Details:------------------------------------------------------- Contact me: [hidden email] | 972-52-7275845 Read me: www.talgalili.com (Hebrew) | www.biostatistics.co.il (Hebrew) | www.r-statistics.com (English) ---------------------------------------------------------------------------------------------- On Thu, Jun 28, 2012 at 12:10 PM, Jan Näs <[hidden email]> wrote: > Hi > > Newbie question: > > I have a set of data frames that I want to do the same calculations on > each. > I've found out that I can put them in a list and loop through the list > to do the calculation, but not put the results back into each > data.frame.. > > For example three data frames cats, dogs, birds > > where >cats > > name eats_kg > 1 bob 3 > 2 garfield 4 > 3 chuck 6 > > and dogs and birds are similar but not same length. > > On each data frame I now want to add a column with cost of food by > calculating "eats_kg"*price of food. > > So question is, can I put all data frames into one loop which returns > a new column for each? > > Ive tried > > MyList <- list(cast,dog,birds) > > for(i in 1:length(MyList)){ > price <- as.data.frame(myList[i])[,2] * cost > .. and then Im stuck. How can I put "price" back into each data frame? > > Thanks in advance. > > ______________________________________________ > [hidden email] 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. > ______________________________________________ [hidden email] 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. |
|
In reply to this post by Jan Näs
Hello,
I tried loop to modify the list, but unfortunately it was not successful. But, I found another way to get the result you wanted (at least from what I understand). #Here are the datasets cats<-read.table(text=" name eats_kg 1 bob 3 2 garfield 4 3 chuck 6 ", sep="",header=TRUE) dogs<-read.table(text=" name eats_kg 1 gob 7 2 rofield 8 3 norris 9 4 rody 6 ", sep="",header=TRUE) birds<-read.table(text=" name eats_kg 1 jud 0.5 2 Trud 0.4 3 Sind 0.6 4 Rav 0.8 ", sep="",header=TRUE) mylist<-list(cats=cats,dogs=dogs,birds=birds) mydf<-do.call("rbind",mylist) price<-c(rep(20,3),rep(25,4),rep(15,4)) mydf$cost_food<-mydf$eats_kg*price animal<-c(rep("cats",3),rep("dogs",4),rep("birds",4)) mydfnew<-data.frame(animal,mydf) row.names(mydfnew)<-1:nrow(mydfnew) mylistnew<-split(mydfnew,list(mydfnew$animal),drop=TRUE) mylistnew1<-list(cats=mylistnew[[2]][-1],dogs=mylistnew[[3]][-1],birds=mylistnew[[1]][-1]) row.names(mylistnew1$dogs)<-1:nrow(mylistnew1$dogs) row.names(mylistnew1$birds)<-1:nrow(mylistnew1$birds) > mylistnew1 $cats name eats_kg cost_food 1 bob 3 60 2 garfield 4 80 3 chuck 6 120 $dogs name eats_kg cost_food 1 gob 7 175 2 rofield 8 200 3 norris 9 225 4 rody 6 150 $birds name eats_kg cost_food 1 jud 0.5 7.5 2 Trud 0.4 6.0 3 Sind 0.6 9.0 4 Rav 0.8 12.0 There might be an easy way in loop to get the same result. A.K. ----- Original Message ----- From: Jan Näs <[hidden email]> To: [hidden email] Cc: Sent: Thursday, June 28, 2012 5:10 AM Subject: [R] loop through and modify multiple data frames Hi Newbie question: I have a set of data frames that I want to do the same calculations on each. I've found out that I can put them in a list and loop through the list to do the calculation, but not put the results back into each data.frame.. For example three data frames cats, dogs, birds where >cats name eats_kg 1 bob 3 2 garfield 4 3 chuck 6 and dogs and birds are similar but not same length. On each data frame I now want to add a column with cost of food by calculating "eats_kg"*price of food. So question is, can I put all data frames into one loop which returns a new column for each? Ive tried MyList <- list(cast,dog,birds) for(i in 1:length(MyList)){ price <- as.data.frame(myList[i])[,2] * cost .. and then Im stuck. How can I put "price" back into each data frame? Thanks in advance. ______________________________________________ [hidden email] 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. ______________________________________________ [hidden email] 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. |
|
Hi Jan,
Glad it helped you in some way. I am also copying to rhelp as your solution might be useful for future reference. A.K. ----- Original Message ----- From: Jan Näs <[hidden email]> To: arun <[hidden email]> Cc: Sent: Friday, June 29, 2012 5:02 AM Subject: Re: [R] loop through and modify multiple data frames Thank you, this helped a bit on the way. I managed to loop through the data frames by haveing an array with data frame names (ex animals <- ("cats","dogs"...etc) ) same as names in the list, to get the results and also split it up back into separate data frames which I was after. something like this ex: for(i in 1:length(animals)){ assign(animals[i] , cbind(as.data.frame(myList[i]), cost)) } /Jan 2012/6/29 arun <[hidden email]>: > Hello, > I tried loop to modify the list, but unfortunately it was not successful. But, I found another way to get the result you wanted (at least from what I understand). > > #Here are the datasets > > cats<-read.table(text=" > name eats_kg > 1 bob 3 > 2 garfield 4 > 3 chuck 6 > ", sep="",header=TRUE) > dogs<-read.table(text=" > name eats_kg > 1 gob 7 > 2 rofield 8 > 3 norris 9 > 4 rody 6 > ", sep="",header=TRUE) > > birds<-read.table(text=" > name eats_kg > 1 jud 0.5 > 2 Trud 0.4 > 3 Sind 0.6 > 4 Rav 0.8 > ", sep="",header=TRUE) > > > mylist<-list(cats=cats,dogs=dogs,birds=birds) > mydf<-do.call("rbind",mylist) > price<-c(rep(20,3),rep(25,4),rep(15,4)) > mydf$cost_food<-mydf$eats_kg*price > > animal<-c(rep("cats",3),rep("dogs",4),rep("birds",4)) > mydfnew<-data.frame(animal,mydf) > row.names(mydfnew)<-1:nrow(mydfnew) > mylistnew<-split(mydfnew,list(mydfnew$animal),drop=TRUE) > mylistnew1<-list(cats=mylistnew[[2]][-1],dogs=mylistnew[[3]][-1],birds=mylistnew[[1]][-1]) > row.names(mylistnew1$dogs)<-1:nrow(mylistnew1$dogs) > row.names(mylistnew1$birds)<-1:nrow(mylistnew1$birds) >> mylistnew1 > $cats > name eats_kg cost_food > 1 bob 3 60 > 2 garfield 4 80 > 3 chuck 6 120 > > $dogs > name eats_kg cost_food > 1 gob 7 175 > 2 rofield 8 200 > 3 norris 9 225 > 4 rody 6 150 > > $birds > name eats_kg cost_food > 1 jud 0.5 7.5 > 2 Trud 0.4 6.0 > 3 Sind 0.6 9.0 > 4 Rav 0.8 12.0 > > There might be an easy way in loop to get the same result. > > A.K. > > > > > > > > ----- Original Message ----- > From: Jan Näs <[hidden email]> > To: [hidden email] > Cc: > Sent: Thursday, June 28, 2012 5:10 AM > Subject: [R] loop through and modify multiple data frames > > Hi > > Newbie question: > > I have a set of data frames that I want to do the same calculations on each. > I've found out that I can put them in a list and loop through the list > to do the calculation, but not put the results back into each > data.frame.. > > For example three data frames cats, dogs, birds > > where >cats > > name eats_kg > 1 bob 3 > 2 garfield 4 > 3 chuck 6 > > and dogs and birds are similar but not same length. > > On each data frame I now want to add a column with cost of food by > calculating "eats_kg"*price of food. > > So question is, can I put all data frames into one loop which returns > a new column for each? > > Ive tried > > MyList <- list(cast,dog,birds) > > for(i in 1:length(MyList)){ > price <- as.data.frame(myList[i])[,2] * cost > .. and then Im stuck. How can I put "price" back into each data frame? > > Thanks in advance. > > ______________________________________________ > [hidden email] 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. > ______________________________________________ [hidden email] 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. |
| Powered by Nabble | Edit this page |
