В базе вы можете использовать ave
в сочетании с cumsum
, чтобы разделить ваш набор данных и применить там seq
, как вы уже пробовали.
df$y <- ave(df$y, cumsum(!is.na(df$y)), FUN=function(x)
seq(x[1], length.out = length(x)))
identical(df, dfExpected)
#[1] TRUE
df$y
#[1] 2000 2001 2002 2000 2001 2002
ВЕсли он начинается с NA
, а затем вы хотите, чтобы он начинался с 2000
, вы можете использовать replace
:
df2$y <-ave(df2$y, cumsum(!is.na(df2$y)), FUN=function(x)
seq(replace(x[1],is.na(x[1]),2000), length.out = length(x)))
identical(df2, dfExpected)
#[1] TRUE
Данные:
df <- data.frame(x = c("A", "B", "C", "A", "B", "C"),
y = c(2000, NA, NA, 2000, 2001, 2002))
dfExpected <- data.frame(x = c("A", "B", "C", "A", "B", "C"),
y = c(2000, 2001, 2002, 2000, 2001, 2002))
df2 <- data.frame(x = c("A", "B", "C", "A", "B", "C"),
y = c(NA, NA, NA, 2000, 2001, 2002))