r - 如何从 dplyr 数据框中的每组中选择最后 N 个观察值?

标签 r dplyr

给定一个数据框:

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

请问这里有什么问题吗?

我得到的错误是:

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

最佳答案

因为这是一个基于dplyr的具体问题

1) 在group_by之后,在row_number()上使用slice

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 中的filter

df %>% 
   group_by(a) %>% 
   filter(row_number() >= (n() - 1))
<小时/>

3) 或与 dotail

df %>%
    group_by(a) %>% 
    do(tail(., 2))
<小时/>

4)除了tidyverse方法之外,我们还可以使用紧凑的data.table

library(data.table)
setDT(df)[df[, .I[tail(seq_len(.N), 2)], a]$V1]
<小时/>

5) 或来自 base Rby

by(df, df$a, FUN = tail, 2)

6) 或使用来自 base Raggregate

df[aggregate(c ~ a, transform(df, c = seq_len(nrow(df))), FUN = tail, 2)$c,]

7) 或使用来自 base Rsplit

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

关于r - 如何从 dplyr 数据框中的每组中选择最后 N 个观察值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994497/

相关文章:

r - 使用箭头连接一项内但跨组的点

r - 将参数传递给闭包(?)

r - 大字符串向量到 data.frame

r - 在 r 中一步聚合和计算

r - 如何使用整洁的求值语义来选择、复制和重命名 tibble 中的多个列?

再现 Fisher 线性判别图

r - dplyr::do 如何与 data.table 一起工作

r - 根据年份列信息按组进行数据扩展

R - 使用 dplyr mutate 和 if_else 期望单个值时出错

r - 将 MASS::fitdistr 按一个因子应用于多个数据