如果组超过五行,则仅保留前五行

时间:2016-03-09 10:14:22

标签: r

我有一个 USERID 的数据框(因此我们将其分组),以及其他变量状态日期

其中一些 USERID 的状态超过5种,因此我们应该只保留最近的5种状态,日期

我应该如何对此进行编码,看起来很简单但我没有设法这样做。

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table。转换' data.frame'到' data.table' (setDT(df1)),按' USERID'分组,我们order'日期'逐渐减少(假设'日期'列为Date类)并获得前{5}行head

library(data.table)
setDT(df1)[order(-date), head(.SD, 5), by=USERID]

或者如评论中提到的@Symbolix,我们也可以使用.I获取行索引,然后删除不包含5行的组的NA行。

 na.omit(setDT(df1)[df1[order(-date), .I[1:5], by= USERID]$V1 ])

数据

set.seed(49)
df1 <- data.frame(USERID= sample(LETTERS[1:3], 12, 
  replace=TRUE), date= sample(seq(as.Date('2014-01-01'), 
  length.out=12, by = '1 day')))

答案 1 :(得分:2)

如果你是dplyr的粉丝,你可以做

library(dplyr)

df %>%
  group_by(USERID) %>%
  arrange(-date) %>%
  slice(1:5) %>%
  ungroup

在“大型”数据集上,data.table方法可能会更快,但dplyr的语法稍微容易一些(首先在我看来)。