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 中做到这一点?
您可以这样做,其中 NA
与 lag_a
中 df$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
我习惯在我的代码中使用 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 中做到这一点?
您可以这样做,其中 NA
与 lag_a
中 df$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