Отставание () и отрыв () в base-R

Я привык использовать dplyr lag() а также lead() в моем коде, но мне интересно - есть ли альтернатива Base 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

Есть ли способ сделать это в базе R?

1 ответ

Решение

Вы могли бы сделать что-то вроде этого, где NAs объединяются с подмножеством df$a в lag_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
Другие вопросы по тегам