2017-08-02 155 views
1

我想写一个“for循环”来通过迭代来更新我的R数据框。For循环更新data.frame

这里是我的代码:

datalist = list() 

for (i in 1:5) { 
dat <- data.frame(ID=LETTERS[seq(from = 1, to = 20)],nutrition=rnorm(20, mean=50, sd=10), 
       Stage=c(rep("A1",5), rep("B1",15))) 
dat$ADG<-dat$nutrition*0.05 
dat$M_weight<-dat$nutrition*0.5+dat$ADG*100 
dat$Age<-dat$M_weight*1.1+dat$ADG*0.6 
dat$Stage<-as.character(dat$Stage) 
dat$Stage[dat$ADG>=3]<-"C1" 
dat$i <- i # maybe you want to keep track of which iteration produced it? 
datalist[[i]] <- dat # add it to your list # 



} 

big_data = do.call(rbind, datalist) 

从迭代2,我想有“舞台”更新为“C1”如果ADG等于或大于3,但这并不适用于迭代1。

非常感谢!我感谢任何答复!

+0

不清楚你的意思。循环正在做它应该做的事情,因为迭代器'i'只在一个地方使用。如果你想对前一次迭代进行一些依赖,可能会添加一个'if(i> 1){do stuff with i-1}'block? – Frank

+1

嗨@Frank。谢谢。是的,我希望对前面的迭代有一定的依赖性,所以我会尝试你提到的方块。谢谢,我感谢你的回答。 – Joanna

+1

@Joanna你的代码只更新''舞台'基于'ADG',但'ADG'永远不会改变。迭代1后的数据应该如何与原始数据不同? – CPak

回答

1

我想你想一个recursive功能,而不是一个迭代

你的数据stringsAsFactors=F

dat <- data.frame(ID=LETTERS[seq(from = 1, to = 20)], nutrition=rnorm(20, mean=50, sd=10), Stage=c(rep("A1",5), rep("B1",15)), stringsAsFactors=F) 

使用tidyversedplyrpurrr动词

library(tidyverse) 
special <- function(dat, counter, end) { 
       dat1 <- dat %>% 
         mutate(ADG = nutrition*0.05) %>% 
         mutate(M_weight = nutrition*0.5 + ADG*100) %>% 
         mutate(Age = M_weight*1.1 + ADG*0.6) %>% 
         mutate(Stage = ifelse(ADG >= 3, "C1", Stage)) %>% 
         mutate(i=counter) 
       if (counter < end) { 
         special(dat1, counter+1, end) 
       } else { 
         return(dat1) 
       }     
      } 

desired <- map_df(2:5, ~special(dat,1,.x)) 

head(desired)

ID nutrition Stage  ADG M_weight  Age i 
1 A 47.17826 A1 2.358913 259.4804 286.8438 2 
2 B 64.55988 C1 3.227994 355.0794 392.5241 2 
3 C 52.29020 A1 2.614510 287.5961 317.9244 2 
4 D 59.96544 A1 2.998272 329.8099 364.5899 2 

让我知道如果这不是你所期望的输出

+0

谢谢@Chi Pak。结合“所需”和第一个数据框正是我想要的。我感谢您的帮助! – Joanna