Здесь решение с dplyr
.
В моем примере я вырезал только первое и последнее значения. (вы можете изменить его, изменив 2 на любое число в filter
).
Идея состоит в том, чтобы добавить после вас group_by
id номер строки для каждого наблюдения, начиная сверху (n
) и наоборот снизу (n1
), тогда вы просто отфильтруете.
library(dplyr)
data %>%
group_by(id) %>%
mutate(n=1:n(),
n1 = n():1) %>% # n and n1 are the row numbers
filter(n >= 2,n1 >= 2) %>% # change 2 with 10, or whatever
# filter() keeps only the rows that you want
select(-n, -n1) %>%
ungroup()
# # A tibble: 4 x 2
# id value
# <dbl> <int>
# 1 1 6
# 2 1 8
# 3 2 1
# 4 2 2
Данные:
set.seed(123)
data <- data.frame(id = c(rep(1,4), rep(2,4)), value=sample(8))
data
# id value
# 1 1 3
# 2 1 6
# 3 1 8
# 4 1 5
# 5 2 4
# 6 2 1
# 7 2 2
# 8 2 7