2017-05-03 79 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