Как избежать цикла For для расчета новой переменной по группам

mehdi спросил: 03 ноября 2018 в 08:55 в: r

Я надеюсь, что кто-то здесь может мне помочь. Я пытаюсь изучить кодирование R для своей работы.

Я слежу за ростом растений (называемых экотипом) с течением времени, они обрабатываются с помощью Mock или бактерий Xcc. У меня есть 2 различных эксперимента (выполненных в разное время), и после обработки изображения я получаю Площадь.

Я хотел бы вычислить Normalized_Area = Area (t1) / Area (t0) для каждого экотипа, для каждой обработки для каждого эксперимента (Manip), который представляет собой площадь за время, разделенную на площадь этого экотипа à значимость эксперимента (t0). Каждое растение имеет разную площадь в момент времени 0, а разные эксперименты имеют разное время начала. (пример ожидаемых результатов в столбце Normalized_Area)

Ниже приведен фрагмент моего df.

    # A tibble: 24 x 6
   Manip Traitment Ecotype Date                 Area Normalized_Area
   <dbl> <chr>     <chr>   <dttm>              <dbl>           <dbl>
 1     1 mock      a1-2    2017-12-12 00:00:00 17699            1   
 2     1 mock      a1-2    2017-12-13 00:00:00 24538            1.39
 3     1 mock      a1-2    2017-12-14 00:00:00 27958            1.58
 4     1 xcc       a1-2    2017-12-12 00:00:00 19857            1   
 5     1 xcc       a1-2    2017-12-13 00:00:00 27973            1.41
 6     1 xcc       a1-2    2017-12-14 00:00:00 35875            1.81
 7     2 mock      a1-2    2018-03-20 00:00:00 18177            1   
 8     2 mock      a1-2    2018-03-21 00:00:00 20251            1.11
 9     2 mock      a1-2    2018-03-23 00:00:00 36679            2.02
10     2 xcc       a1-2    2018-03-20 00:00:00 17261            1   
11     2 xcc       a1-2    2018-03-21 00:00:00 18697            1.08
12     2 xcc       a1-2    2018-03-23 00:00:00 35345            2.05
13     1 mock      a1-10   2017-12-12 00:00:00 22853            1   
14     1 mock      a1-10   2017-12-13 00:00:00 34641            1.52
15     1 mock      a1-10   2017-12-14 00:00:00 40311            1.76
16     1 xcc       a1-10   2017-12-12 00:00:00 23754            1   
17     1 xcc       a1-10   2017-12-13 00:00:00 33247            1.40
18     1 xcc       a1-10   2017-12-14 00:00:00 40603            1.71
19     2 mock      a1-10   2018-03-20 00:00:00 28201            1   
20     2 mock      a1-10   2018-03-21 00:00:00 30306            1.07
21     2 mock      a1-10   2018-03-23 00:00:00 49086            1.74
22     2 xcc       a1-10   2018-03-20 00:00:00 27217            1   
23     2 xcc       a1-10   2018-03-21 00:00:00 29844            1.10
24     2 xcc       a1-10   2018-03-23 00:00:00 46540            1.71

я написал фрагмент кода, используя циклы For, но это поднять некоторые ошибки, и я хотел бы превратить его в более читаемый код с помощью dplyr

date_debut=c("2017-12-12", "2018-03-20") # starting_time
data$Normalized_Area = NA   for(manips in levels(as.factor(data$Manip))){     # for each manip      
   for(ecoty in levels(as.factor(data$Ecotype))){  # for each ecotype        
       for(traity in levels(as.factor(data$Traitement))){  # for each treatment           
           for( dd in levels(as.factor(date_debut))){    # for each level 
            tmp = subset(data,subset=c(Traitement==traity & Ecotype == ecoty & Manip == manips))  # creation d'un fichier tmp            if(dim(tmp)[1] != 0){                                            
            #tmp = ordered(tmp$date[1:length(tmp$date-1)])            # compute Area mean at D=0 for each Experiement                 if(dd %in% as.character(tmp$Date)!=F){            
              A0 = tmp$Area[as.character(tmp$Date)== dd] # Select  A0 in                  tmp$Area corresponding to dd
              Norm_Area = tmp$Area /A0
              data$Normalized_Area[data$Traitement == traity & data$Ecotype== ecoty & data$Manip == manips] = Norm_Area 
            }
        }
      }
    }
  }

Здесь начинается мой новый код, но я застреваю

gpeData %>% 
    group_by(Traitement, Ecotype, Manip )  %>% 
    mutate_( Normalized_Area = Area / Area[wich(Date %in% date_debut)] ) 

Кто-нибудь знает, как это сделать? Я прошу прощения за уродливый код, но я узнал, что oneBest

0 ответов