2017-05-03 28 views
5

Ben Ar oldukça yeni ve böyle bir veri çerçevesi var R.
için Excel'de yapılan bir hesaplama kopyalamak çalışıyorum:satır ekle

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) 

Baskılı şu şekilde görünür: o end_time insert bir azsa

her bileşen için
# 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 

, o zaman, Birinci için Başlama Zamanı + Report_Time toplamıdır bir hesaplanan sütun "Interval_Time", doldurmak istiyorum Interval_Time toplamı ile satır (Son toplam) + Interv ark. Aralık süresindeki toplamı End_Time'dan daha az olana kadar ekleme işlemini tekrarlayın.

# 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 

Bir for döngüsünün içinde bununla baş etmeye çalışıyorum .. ama başarılı olmadım.

+0

Şunu yapmayın "Araya girme süresinin sonuna kadar ekleme tekrar ** ** ** den daha büyüktür **"? "End_T2ime" bir yazım hatası gibi görünüyor ve toplamı daha büyük olduğunda durdurmak istiyorsunuz. – steveb

cevap

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

Zarif çözüm @Erdem Akkas ... – Umberto

+0

Teşekkürler @fasttouch –

0

Lütfen bu kısmi çözümün sizin için yararlı olup olmadığını kontrol edin. Eğer aralıklı süreye kadar eklemeye devam etmek istiyorsanız End_T2ime'den daha az ise, diğer satırları da kopyalamanız gerekir. data.table ile

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 Akkaş tarafından bir kadar zarif değil ama yine de üzerinde çalışıyordu beri

NB bu yöntem orijinal verileri varsayarak işleri) Her bileşen için sadece bir gözlem olarak çerçeve.

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

Ama bu basit veri tablosu kütüphanesi ile @Erden Akkaş tarafından ony gibi daha çok usul ... Ama nasıl olsa işi alır ...

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