本文介绍了如何从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个观察值/行:
I want to take last N observations / rows from each group:
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
请告知这是怎么回事?
我得到的错误是:
推荐答案
因为这是基于的特定问题dplyr
1 )后er group_by
,在 row_number()
上使用 slice
1) after the group_by
, use slice
on the 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 )或使用 dplyr
df %>%
group_by(a) %>%
filter(row_number() >= (n() - 1))
3 )或使用 do
和 tail
df %>%
group_by(a) %>%
do(tail(., 2))
4 )除 tidyverse
,方法,我们还可以使用紧凑型 data.table
4) In addition to the tidyverse
, methods, we can also use compact data.table
library(data.table)
setDT(df)[df[, .I[tail(seq_len(.N), 2)], a]$V1]
5 )或由
来自 base R
by(df, df$a, FUN = tail, 2)
6 )或从基础R
起带有总计
df[aggregate(c ~ a, transform(df, c = seq_len(nrow(df))), FUN = tail, 2)$c,]
7 )或使用从
base R
do.call(rbind, lapply(split(df, df$a), tail, 2))
这篇关于如何从dplyr数据框中的每个组中选择最后N个观测值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!