Поскольку ваш фрейм данных имеет несколько нечисловых столбцов («дата» и «имя»), вероятно, имеет смысл создавать новые строки с NA
, а не 0
.Вот один из способов сделать это:
# the data as provided
df <- read.table(text = 'id place name date Measure
1 24 aa 1989-01-29 0.6
1 24 aa 1989-01-30 0.47
1 24 aa 1989-01-31 0.25
1 24 bb 1989-01-29 0.18
1 24 bb 1989-01-30 0.37
1 24 bb 1989-01-31 0.81
1 25 aa 1989-01-29 0.92
1 25 aa 1989-01-30 0.43
1 25 aa 1989-01-31 0.8
2 24 aa 1989-01-29 0.75
2 24 aa 1989-01-30 0.15
2 24 aa 1989-01-31 0.61', header = T)
# indices of matching dates, then turned into a rolling sum
key.dates <- cumsum(grepl('01-31$', df$date))
# a blank data frame to store padded data
df.new <- data.frame(id = rep(NA, nrow(df) + max(key.dates)), place = NA, name = as.character(NA), date = as.Date(NA), Measure = NA, stringsAsFactors = F)
# copy the old data frame into the new, using the padded indices
df.new[1:nrow(df) + key.dates, ] <- df
id place name date Measure
1 1 24 1 1989-01-29 0.60
2 1 24 1 1989-01-30 0.47
3 NA NA <NA> <NA> NA
4 1 24 1 1989-01-31 0.25
5 1 24 2 1989-01-29 0.18
6 1 24 2 1989-01-30 0.37
7 NA NA <NA> <NA> NA
8 1 24 2 1989-01-31 0.81
9 1 25 1 1989-01-29 0.92
10 1 25 1 1989-01-30 0.43
11 NA NA <NA> <NA> NA
12 1 25 1 1989-01-31 0.80
13 2 24 1 1989-01-29 0.75
14 2 24 1 1989-01-30 0.15
15 NA NA <NA> <NA> NA
16 2 24 1 1989-01-31 0.61