我有一些看起来像这样的数据。
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
我想我想在每小时更改后创建一个空行,然后将前一行复制下来但是给出下一个小时的数字。
答案 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)
您可以尝试merge
和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
答案 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