2016-08-08 3 views
0

Ich habe einige Daten, die so aussehen.Fügen Sie eine folgende Zeile hinzu, um fortlaufende IDs zu erhalten

DESCTV   DT HR 
    show1 2016-05-10 0 
    show2 2016-05-10 2 
    show3 2016-05-10 4 
    show4 2016-05-10 6 

Aber ich will es so aussehen.

DESCTV   DT HR 
    show1 2016-05-10 0 
    show1 2016-05-10 1 
    show2 2016-05-10 2 
    show2 2016-05-10 3 
    show3 2016-05-10 4 
    show3 2016-05-10 5 
    show4 2016-05-10 6 
    show4 2016-05-10 7 

Ich glaube, ich bin zu will eine leere Zeile nach jeder Stunde Wechsel erstellen und dann die vorhergehenden Zeile nach unten kopieren, aber der nächsten Stunde Nummer.

Antwort

2

Sie data.table verwenden können, das heißt

# Load data 
d<- fread("DESCTV   DT HR 
show1 2016-05-10 0 
show2 2016-05-10 2 
show3 2016-05-10 4 
show4 2016-05-10 6") 

# 2 steps: (1) add rows (2) fill with specified values 
d.out <- setDT(d)[, .SD[1:(.N+1)], by=list(DESCTV, DT) 
][, HR:=ifelse(is.na(HR), as.integer((shift(HR)+1)), HR), by=list(DESCTV, DT)] 

d.out dass wie folgt aussieht:

# > d.out 
# DESCTV   DT HR 
# 1: show1 2016-05-10 0 
# 2: show1 2016-05-10 1 
# 3: show2 2016-05-10 2 
# 4: show2 2016-05-10 3 
# 5: show3 2016-05-10 4 
# 6: show3 2016-05-10 5 
# 7: show4 2016-05-10 6 
# 8: show4 2016-05-10 7 
1

können Sie versuchen, eine merge und fill:

tidyr::fill(merge(df, data.frame(HR = 0:7), by = "HR", all = T), DESCTV, DT) 

# HR DESCTV   DT 
#1 0 show1 2016-05-10 
#2 1 show1 2016-05-10 
#3 2 show2 2016-05-10 
#4 3 show2 2016-05-10 
#5 4 show3 2016-05-10 
#6 5 show3 2016-05-10 
#7 6 show4 2016-05-10 
#8 7 show4 2016-05-10 
1

Wir base R

0 verwenden könnte
df2 <- df1[rep(1:nrow(df1), each=unique(diff(df1$HR))),] 
df2$HR <- (1:nrow(df2))-1 
row.names(df2) <- NULL 
df2 
# DESCTV   DT HR 
#1 show1 2016-05-10 0 
#2 show1 2016-05-10 1 
#3 show2 2016-05-10 2 
#4 show2 2016-05-10 3 
#5 show3 2016-05-10 4 
#6 show3 2016-05-10 5 
#7 show4 2016-05-10 6 
#8 show4 2016-05-10 7