如何从 dplyr 数据框中的每组中选择最后 N 个观察结果? [英] How to select last N observation from each group in dplyr dataframe?

查看:19
本文介绍了如何从 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

请指教这里有什么问题?

Please advise what is wrong here?

我得到的错误是:

订单错误(order_by)[[n]] : 下标越界

Error in order(order_by)[[n]] : subscript out of bounds

推荐答案

因为它是基于 dplyr

1) 在 group_by 之后,在 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) 或使用 dotail

df %>%
    group_by(a) %>% 
    do(tail(., 2))

<小时>

4) 除了tidyverse、方法,我们还可以使用compact 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) 或 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) 或使用 splitbase R

do.call(rbind, lapply(split(df, df$a), tail, 2))

这篇关于如何从 dplyr 数据框中的每组中选择最后 N 个观察结果?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆