R 若组中有五行以上,则仅保留前五行

R 若组中有五行以上,则仅保留前五行,r,R,我有一个数据框,其中包含用户ID(因此我们按此分组),以及其他变量状态和日期 其中一些USERID的有5种以上的状态,因此我们应该在日期之前只保留最近的5种状态 我应该如何编码这个,看起来很简单,但我还没有做到。我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(df1)),按“USERID”分组,我们对“date”进行降序排序(假设“date”列为dateclass),并获取头5行head library(data.table) setDT(

我有一个数据框,其中包含用户ID(因此我们按此分组),以及其他变量状态日期

其中一些USERID的有5种以上的状态,因此我们应该在日期之前只保留最近的5种状态


我应该如何编码这个,看起来很简单,但我还没有做到。

我们可以使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“USERID”分组,我们对“date”进行降序排序(假设“date”列为
date
class),并获取头5行
head

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

或者正如注释中提到的@symbolX,我们也可以使用
.I
获取行索引,然后删除没有5行的组的NA行)

数据
set.seed(49)

df1我们可以使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“USERID”分组,我们对“date”进行降序排序(假设“date”列为
date
class),并获取头5行
head

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

或者正如注释中提到的@symbolX,我们也可以使用
.I
获取行索引,然后删除没有5行的组的NA行)

数据
set.seed(49)

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

library(dplyr)

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

在“大型”数据集上,
data.table
方法可能会更快,但是
dplyr
有一个稍微简单的语法,可以让你一开始就明白(在我看来)。

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

library(dplyr)

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

在“大型”数据集上,
data.table
方法可能会更快,但是
dplyr
有一个稍微简单的语法,可以让你一开始就明白(在我看来)。

还有
df1[df1[order(-date),.I[1:5],by=userid]$V1][is.na(userid)]
我认为没有必要使用
if
语句(
head
提供尽可能多的行,但不超过限制)也
df1[df1[order(-date),.I[1:5],by=userid]$V1[!is.na(userid)]
我认为没有必要使用
if
语句(
head
提供尽可能多的行,但不超过限制)请阅读关于和如何给出a的信息。这将使其他人更容易帮助你。我希望让新用户在第一次提问时有机会改进他们的问题,而不立即进行否决表决,否则会令人沮丧,可能会赶走新用户。仅是我个人的意见…请阅读关于a的信息d如何给出a。这将使其他人更容易帮助你。I如何让首次提问的新用户有机会改进他们的问题,而不立即进行否决表决,否则会令人沮丧,可能会赶走新用户。这只是我个人的意见。。。