base-R 中的 lag() 和 lead()

lag() and lead() in base-R

我习惯在我的代码中使用 dplyr 的 lag()lead(),但我想知道 - 是否有基本的 R 替代方案?

例如,假设以下数据框:

df<-data.frame(a=c("a","a","a","b","b"),stringsAsFactors=FALSE)

使用 dplyr,我可以这样做来标记 a 中新分组的开始:

df %>% mutate(groupstart=a!=lag(a)|is.na(lag(a)))
  a groupstart
1 a       TRUE
2 a      FALSE
3 a      FALSE
4 b       TRUE
5 b      FALSE

有没有办法在 base R 中做到这一点?

您可以这样做,其中 NAlag_adf$a 的子集组合,然后与 df$a 进行比较:

lag_a <- c(rep(NA, 1), head(df$a, length(df$a) - 1))
df$groupstart <- df$a != lag_a | is.na(lag_a)

#### OUTPUT ####

  a groupstart
1 a       TRUE
2 a      FALSE
3 a      FALSE
4 b       TRUE
5 b      FALSE

你可以在一个函数中概括这个原则:

lead_lag <- function(v, n) {
    if (n > 0) c(rep(NA, n), head(v, length(v) - n))
    else c(tail(v, length(v) - abs(n)), rep(NA, abs(n)))
}

#### OUTPUT ####

lead_lag(df$a, 2)  #[1] NA  NA  "a" "a" "a"
lead_lag(df$a, -2) #[1] "a" "b" "b" NA  NA
lead_lag(df$a, 3)  #[1] NA  NA  NA  "a" "a"
lead_lag(df$a, -4) #[1] "b" NA  NA  NA  NA