r - 如何从 dplyr 数据框中的每个组中选择最后 N 个观察值?
问题描述
给定一个数据框:
df <- structure(list(a = c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4), b = c(34,
343, 54, 11, 55, 62, 59, -9, 0, -0.5)), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))
我想从每组中获取最后 N 个观察值/行:
df %>%
dplyr::group_by(a) %>%
dplyr::last(2)
给我错误的结果。
我希望它是:
a b
1 343
1 54
2 55
2 62
3 59
3 -9
4 0
4 -0.5
请指教这里有什么问题?
我得到的错误是:
顺序错误(order_by)[[n]]:下标超出范围
解决方案
因为这是一个基于的具体问题dplyr
1 ) 在 之后group_by
,使用slice
onrow_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
fromdplyr
df %>%
group_by(a) %>%
filter(row_number() >= (n() - 1))
3 ) 或与do
和tail
df %>%
group_by(a) %>%
do(tail(., 2))
4 ) 除了tidyverse
, 方法,我们还可以使用 compactdata.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))
推荐阅读
- apache - .htaccess - 如何替换旧网址然后重定向到新网址
- android - 我的应用在 Android 9(Pie) 中更新后崩溃
- ruby-on-rails - Rails:如何在 Rails 5.2.1 中实现动作文本?
- javascript - 两种货币的货币换算
- clang - Macports 和 LC_VERSION_MIN_MACOSX
- reactjs - 如何在 Material UI 中定位表单对话框?
- python - 在 python 中导入 gTTS
- r - 复制的噩梦,根据另一个文件夹中的文件选择要复制的文件
- r - 如何使用 bayesboot() 计算 95% 置信区间
- python - 字典中的值和键之间的计算