我有一个 USERID 的数据框(因此我们将其分组),以及其他变量状态和日期。
其中一些 USERID 的状态超过5种,因此我们应该只保留最近的5种状态,日期。
我应该如何对此进行编码,看起来很简单但我没有设法这样做。
答案 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
的语法稍微容易一些(首先在我看来)。