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.
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: Tal.Galili@gmail.com | 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 <jan@plattfot.com> 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. > > ______________________________________________ > 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. >[[alternative HTML version deleted]]
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 <jan at plattfot.com>
To: r-help at r-project.org
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.
______________________________________________
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.
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 <skydiver.jan at gmail.com>
To: arun <smartpink111 at yahoo.com>
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 <smartpink111 at yahoo.com>:> 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 <jan at plattfot.com>
> To: r-help at r-project.org
> 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.
>
> ______________________________________________
> 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.
>