Отставание () и отрыв () в 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 ответ
Решение
Вы могли бы сделать что-то вроде этого, где NA
s объединяются с подмножеством 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