2017-08-02 8 views
1

私は、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から、私はADGが3以上であるが、これは反復1には適用されない場合に「C1」更新「ステージ」を持っていると思います。

ありがとうございました!私はすべての返信に感謝!

+0

意味が明確ではありません。ループは、イテレータ 'i'が1つの場所でのみ使用されるため、必要な処理を行っています。以前の繰り返しに依存したい場合は、 'if(i> 1){i-1でブロックする}'ブロックを追加してください。 – Frank

+1

こんにちは@フランク。ありがとう。はい、私は以前の反復に多少依存したいので、あなたが言及したブロックを試してみましょう。ありがとう、私はあなたの答えに感謝します。 – Joanna

+1

@ Joannaあなたのコードは 'ADG'に基づいて' Stage'を更新するだけですが、 'ADG'は決して変更しません。反復1の後のデータは元のデータとどのように異なるはずですか? – CPak

答えて

1

私はあなたの代わりに、反復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

Thanks @Chi Pak。 「希望」と最初のデータフレームを組み合わせることで、まさに私が求めているものです。私はあなたの助けに感謝します! – Joanna

関連する問題