r - 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)
任何想法都会非常感激。
解决方案
您可以使用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
推荐阅读
- javascript - 从我的函数返回结果
- dart - 如何在 Flutter 中为 Container 小部件自定义/旋转 BoxDecoration?
- java - 标准输出缓冲区大小是多少?
- google-analytics - 在 Google Analytics 中跟踪添加到 HomeScreen Web 应用程序
- android - 即使输入错误,Retrofit 也会返回 200 并开始下一个活动
- java - Spring Batch - 自定义作业 - 动态传递分区文件名
- postgresql - 如何使用 PostgresQL 在这些存储桶中创建存储桶和组
- python - Python:将日志文件的所有内容压缩为 tgz 格式
- css - Bootstrap 4如何在不超出空间的情况下在列之间设置边距
- javascript - Kendo:上下文主菜单的方向属性