2017-08-02 156 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