Поскольку это конкретный вопрос, основанный на dplyr
1 ) после group_by
, используйте slice
на row_number()
library(tidyverse)
df %>%
group_by(a) %>%
slice(tail(row_number(), 2))
# A tibble: 8 x 2
# Groups: a [4]
# a b
# <dbl> <dbl>
#1 1 343
#2 1 54
#3 2 55
#4 2 62
#5 3 59
#6 3 -9
#7 4 0
#8 4 -0.5
2 ) Или используйте filter
из dplyr
df %>%
group_by(a) %>%
filter(row_number() >= (n() - 1))
3 ) или с do
и tail
df %>%
group_by(a) %>%
do(tail(., 2))
4 ) В дополнение к tidyverse
, методы, мы также можем использовать компактные data.table
library(data.table)
setDT(df)[df[, .I[tail(seq_len(.N), 2)], a]$V1]
5 ) или by
от base R
by(df, df$a, FUN = tail, 2)
6 ) или aggregate
от base R
df[aggregate(c ~ a, transform(df, c = seq_len(nrow(df))), FUN = tail, 2)$c,]
7 ) или split
с base R
do.call(rbind, lapply(split(df, df$a), tail, 2))