Insert rows in a calculation-based data framework

I am new to R and I am trying to copy the calculation made in Excel to R.
I have a data frame like this:

Component <- c("A", "B", "C") Report_Time <- c(5781, 5781, 5781) Interval <- c(700, 600, 800) End_Time <- c(8281, 8281, 8281) Start_Time <- c(800, 298, 780) df <- data.frame(Component, Report_Time, Interval, End_Time, Start_Time) 

When printed, it looks like this:

 # Component Report_Time Interval End_Time Start_Time #1 A 5781 700 8281 800 #2 B 5781 600 8281 298 #3 C 5781 800 8281 780 

For each component, I want to populate the calculated Interval_Time column, which is the sum of Start Time + Report_Time for First, and then, if it is less than End_Time, insert a row with the sum of Interval_Time (Last Amount) + Interval. Repeat the insert until the amount in the time span is less than End_Time.

 # Component Report_Time Interval End_Time Start_Time Interval_Time #1 A 5781 700 8281 800 6581 #2 A 5781 700 8281 800 7281 #3 A 5781 700 8281 800 7981 #4 B 5781 1000 8281 298 6079 #5 B 5781 1000 8281 298 7079 #6 B 5781 1000 8281 298 8079 #7 C 5781 1200 8281 780 6561 #8 C 5781 1200 8281 780 7761 

I tried to achieve this if inside the for loop ... but was not successful.

+5
source share
3 answers

With data.table :

 Component <- c("A", "B", "C") Report_Time <- c(5781, 5781, 5781) Interval <- c(700, 1000, 1200) End_Time <- c(8281, 8281, 8281) Start_Time <- c(800, 298, 780) df <- data.frame(Component, Report_Time, Interval, End_Time, Start_Time) library(data.table) setDT(df) df<-df[rep(1:.N,ceiling((End_Time-Start_Time-Report_Time)/Interval))] df[,Interval_Time:=ifelse(.I==1,Start_Time+Report_Time,Start_Time+cumsum(Interval)+Report_Time-Interval),by=.(Component)] df Component Report_Time Interval End_Time Start_Time Interval_Time 1: A 5781 700 8281 800 6581 2: A 5781 700 8281 800 7281 3: A 5781 700 8281 800 7981 4: B 5781 1000 8281 298 6079 5: B 5781 1000 8281 298 7079 6: B 5781 1000 8281 298 8079 7: C 5781 1200 8281 780 6561 8: C 5781 1200 8281 780 7761 
+3
source

Please check if this partial solution is useful for you. If you want to keep adding up to less than End_T2ime, you also have to duplicate other lines.

 Component <- c("A", "B", "C") Report_Time <- c(5781, 5781, 5781) Interval <- c(700, 600, 800) End_Time <- c(8281, 8281, 8281) Start_Time <- c(800, 298, 780) df <- data.frame(Component, Report_Time, Interval, End_Time, Start_Time) df$Interval_time[1]=df[1,2]+df[1,5] for(i in 2:nrow(df)) { if((df[i,2]+df[i,5]) < df[i,4]) df$Interval_time[i]=df$Interval_time[i-1]+df[i,3] else df$Interval_time[i]=df[i,2]+df[i,5] } 
0
source

Not as elegant as the one that was @Erden Akkas, but since I worked on it anyway;)

NB this method works, assuming that the original data frame is only one observation for each component.

 df$value <- df$Start_Time + df$Report_Time for (i in 1:nrow(df)) { t <- df[i,] val <- t$value repeat { val <- val + t$Interval if (val > t$End_Time) {break} dftmp <- df[i,] dftmp$value <- val # Insert new Record df <- rbind(df, dftmp) } } df[with(df, order(Component)), ] 

But this is obviously more procedural in nature, like ony by @Erden Akkas with a data table library ... But it still does the job ...

  Component Report_Time Interval End_Time Start_Time value 1 A 5781 700 8281 800 6581 4 A 5781 700 8281 800 7281 5 A 5781 700 8281 800 7981 2 B 5781 600 8281 298 6079 21 B 5781 600 8281 298 6679 22 B 5781 600 8281 298 7279 23 B 5781 600 8281 298 7879 3 C 5781 800 8281 780 6561 31 C 5781 800 8281 780 7361 32 C 5781 800 8281 780 8161 
0
source

All Articles