首页 > 解决方案 > R中每组最后6行的新数据框

问题描述

我有一个数据框,其中包含多个组和每组不同数量的观察值。我想创建一个新的数据框,每组不超过 n 个观察值。具体来说,对于人数较多的组,我想选择最后的 n 个观察值。一个示例数据集:

timea <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,21,22,23,24,25,26,27,28,29,30,5,6,7,8,9,10,25,26,27)
groupa <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4)
vara <-c(7,7,8,10,9,2.5,7,8,9,1,3,4,8,9,10,2.5,3,9,8,3,5,8,1,7,9,10,2,6,4,3.5,9,8,6)

test1 <- data.frame(timea,groupa,vara)

我想要一个新的数据框,每组不超过 6 个观察值(groupa),方法是选择每组的最后 6 个。我试图找到一个dplyr解决方案,也许使用该lag函数,但我不确定如何解释那些少于 6 个观察值的问题。

预期的输出将是:

timea <- c(9,10,11,12,13,14,25,26,27,28,29,30,5,6,7,8,9,10, 25, 26,27)
groupa <- c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4)
vara <-c(9,1,3,4,8,9,8,3,5,8,1,7,9,10,2,6,4,3.5,9,8,6)


output <- data.frame(timea,groupa,vara)

任何想法都会非常感激。

标签: rdataframesubset

解决方案


您可以使用slice_tail函数 in从每个组中dplyr获取最后n一行。如果一个组中的行数少于 6,它将返回该组的所有行。

library(dplyr)
test1 %>% group_by(groupa) %>% slice_tail(n = 6) %>%  ungroup

# A tibble: 21 x 3
#   timea groupa  vara
#   <dbl>  <dbl> <dbl>
# 1     9      1     9
# 2    10      1     1
# 3    11      1     3
# 4    12      1     4
# 5    13      1     8
# 6    14      1     9
# 7    25      2     8
# 8    26      2     3
# 9    27      2     5
#10    28      2     8
# … with 11 more rows

推荐阅读