添加后续行以获取连续ID

时间:2016-08-08 16:01:00

标签: r

我有一些看起来像这样的数据。

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

但我希望它看起来像这样。

 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

我想我想在每小时更改后创建一个空行,然后将前一行复制下来但是给出下一个小时的数字。

3 个答案:

答案 0 :(得分:2)

您可以使用data.table,即

# 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看起来像这样:

# > 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 :(得分:1)

您可以尝试mergefill

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

答案 2 :(得分:1)

我们可以使用base R

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