2017-05-03 108 views
5

我非常新的R和我試圖複製在Excel做R.
我有這樣一個數據幀的計算:插入行基於計算

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) 

當印它看起來像這樣:

# 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 

對於每個組件,我想填充計算列「Interval_Time」,這是開始時間+ Report_Time爲首先的總和,那麼如果它小於END_TIME插入一個行與Interval_Time(最後總和)+ Interv的總和人。重複插入,直到間隔時間的總和小於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 

我一直在努力實現這一點,如果內部的循環..但一直沒有succesfull。

+0

你不是說「重複插入,直到間隔時間內的總和大於**結束時間**」? 「End_T2ime」看起來像一個錯字,並且當總和較大時你想停止。 – steveb

回答

3

隨着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 
+0

優雅的解決方案@Erdem Akkas ... – Umberto

+0

Thanks @fasttouch –

0

請檢查此部分解決方案對您是否有用。如果你想繼續添加,直到間隔時間小於End_T2ime,那麼你也必須複製其他行。

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

不一樣優雅的一個由@Erden Akkas,但因爲我工作也無妨;)

NB此方法效果假設原始數據幀作爲每個組件的唯一觀察值。

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)), ] 

但是,這顯然是在自然界中的ONY通過@Erden Akkas數據表庫的詳細程序......但它變得無論如何完成任務......

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