Пример данных
set.seed(123)
df <- data.frame(year = c(rep(1980:1994, each = 9), rep(1995, times = 8), rep(1996:2012, each = 9),
rep(2013, times = 7), rep(2014, times = 9)),
ref.doy = sample(120:180, 312, replace = T),
x = rnorm(312))
Для каждого года, если нет.из ref.doy
- это не 9, тогда я хочу вставить дополнительные новые строки, которые являются точной копией последней строки.
Например, если для 1995 года есть только 8 ref.doy
, я хочускопируйте 8-й ряд, сделайте 9-й ряд.Если в 2013 году их всего 8 ref.doy
, то я хочу скопировать 7-ю строку и продублировать ее как 8-ю и 9-ю строку и т. Д.
Решение, которое у меня есть на данный момент, - это цикл for:
x <- df %>% group_by(year) %>% dplyr::mutate(y.length = n())
year.vec <- 1980:2014
temp.list <- list()
for(y in seq_along(year.vec)){
yr <- year.vec[y]
temp <- x %>% dplyr::filter(year == yr)
if(unique(temp$y.length) != 9) {
lastrow <- temp[nrow(temp), ]
lastrow.repeat <- as.data.frame(lapply(lastrow, rep, 9 - nrow(temp)))
full.data <- rbind(data.frame(temp), lastrow.repeat)
temp.list[[y]] <- full.data
} else {
temp.list[[y]] <- temp
}
}
newdata <- rbindlist(temp.list)
Мне нужна помощь, чтобы сделать это в пределах dplyr
или data.table
.