Интересная проблема:
ind <- which(DF$Var_2 > 0)
ind
# [1] 2 4 5 8
starts <- 1L + unique(c(0L, head(ind, n = -1)))
stops <- unique(c(ind, nrow(DF))) # in case the last !0 is not on bottom row
starts
# [1] 1 3 5 6
stops
# [1] 2 4 5 8
DFaug_list <- Map(
function(a, b) rbind(DF[a:b,], DF[b,][rep(NA, DF$Var_2[b]), ]),
starts, stops)
Теперь у нас есть список фреймов:
str(DFaug_list)
# List of 4
# $ :'data.frame': 3 obs. of 2 variables:
# ..$ Var_1: Factor w/ 8 levels "A","B","C","D",..: 1 2 NA
# ..$ Var_2: int [1:3] 0 1 NA
# $ :'data.frame': 4 obs. of 2 variables:
# ..$ Var_1: Factor w/ 8 levels "A","B","C","D",..: 3 4 NA NA
# ..$ Var_2: int [1:4] 0 2 NA NA
# $ :'data.frame': 2 obs. of 2 variables:
# ..$ Var_1: Factor w/ 8 levels "A","B","C","D",..: 5 NA
# ..$ Var_2: int [1:2] 1 NA
# $ :'data.frame': 4 obs. of 2 variables:
# ..$ Var_1: Factor w/ 8 levels "A","B","C","D",..: 6 7 8 NA
# ..$ Var_2: int [1:4] 0 0 1 NA
, и все, что нам нужно сделать, чтобы объединить их, это трюк с do.call
или использовать функции из пакетов data.table
или dplyr
:
DFaug <- do.call(rbind.data.frame, DFaug_list)
DFaug
# Var_1 Var_2
# 1 A 0
# 2 B 1
# NA <NA> NA
# 3 C 0
# 4 D 2
# NA1 <NA> NA
# NA.1 <NA> NA
# 5 E 1
# NA2 <NA> NA
# 6 F 0
# 7 G 0
# 8 H 1
# NA3 <NA> NA
DFaug <- data.table::rbindlist(DFaug_list)
DFaug <- dplyr::bind_rows(DFaug_list)