2017-05-03 15 views
5

私はRにかなり新しいですし、私は、このようなデータフレーム持っR.
にExcelで行わ計算をコピーしようとしています:挿入行は

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) 

印刷された、それは次のようになります。それはEND_TIME、インサートA未満であれば

コンポーネントごと
# 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 

が、私はその後、第1のための開始時間+ REPORT_TIMEの和で計算された列「Interval_Time」を、移入したいですInterval_Time(最終合計)+ Intervの合計を持つ行al。インターバル時間の合計が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 

私はforループ内でこれを実現しようとしていますが、成功していません。

+0

あなたが意味するものではありません「インターバル時間の合計が** ** End_Time **よりも大きい**」まで挿入を繰り返しますか? "End_T2ime"はタイプミスのように見え、合計が大きくなると停止します。 – steveb

答えて

3

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

ありがとう@fasttouch –

0

この部分的な解決策があなたに役立つかどうかを確認してください。間隔の時間がEnd_T2imeより短いまで追加を続けたい場合は、他の行も複製する必要があります。 data.table

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このメソッドは、元のデータを想定して動作します)フレームを各コンポーネントの1つの観測としてのみ表示します。

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

しかし、これは明らかにデータ・テーブル・ライブラリと@Erden AkkasによってONYなど自然の中でより多くの手続きである...しかし、それはとにかく仕事を取得します...

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