R 使用data.table仅保留x个最大的组

R 使用data.table仅保留x个最大的组,r,data.table,R,Data.table,我最近开始在R中使用data.table包,但我最近遇到了一个我不知道如何使用data.table解决的问题 样本数据: set.seed(1) library(data.table) dt = data.table(group=c("A","A","A","B","B","B","C","C"),value = runif(8)) 我可以在语句中添加组计数 dt[,groupcount := .N ,group] 但是现在我只想保留groupcount中具有最大值的x组。让我们假设x=1作

我最近开始在R中使用data.table包,但我最近遇到了一个我不知道如何使用data.table解决的问题

样本数据:

set.seed(1)
library(data.table)
dt = data.table(group=c("A","A","A","B","B","B","C","C"),value = runif(8))
我可以在语句中添加组计数

dt[,groupcount := .N ,group]
但是现在我只想保留
groupcount
中具有最大值的x组。让我们假设
x=1
作为示例。

我尝试如下链接:

dt[,groupcount := .N ,group][groupcount %in% head(sort(unique(groupcount),decreasing=TRUE),1)]
但由于A组和B组都有三个元素,它们都保留在data.table中。我只想要x=1的x个最大的组,所以我只想保留其中一个组(A或B)。我假设这可以通过data.table在一行中完成。这是真的吗?如果是,怎么说


澄清:x在这里是一个任意选择的数字。该函数还应与x=3一起工作,在这里它将返回3个最大的组。

我们可以这样做

x <- 1
dt[dt[, {tbl <- table(group)
         nm <- names(tbl)[tbl==max(tbl)]
        if(length(nm) < x) rep(TRUE, .N)
        else group %in% sample(names(tbl)[tbl==max(tbl)], x)}]]

x如何利用
groupcount

setorder(dt, -groupcount)

x <- 1   
dt[group %in% dt[ , unique(group)][1:x] ]

#   group     value groupcount
# 1:     A 0.2655087          3
# 2:     A 0.3721239          3
# 3:     A 0.5728534          3


x <- 3
dt[group %in% dt[ , unique(group)][1:x] ]


#     group     value groupcount
# 1:     A 0.2655087          3
# 2:     A 0.3721239          3
# 3:     A 0.5728534          3
# 4:     B 0.9082078          3
# 5:     B 0.2016819          3
# 6:     B 0.8983897          3
# 7:     C 0.9446753          2
# 8:     C 0.6607978          2

## alternative syntax
# dt[group %in% unique(dt$group)[1:x] ]
setorder(dt,-groupcount)

这里有一个使用连接的方法

x <- 1

dt[dt[, .N, by=group][order(-N)[1:x]], on="group"]
   group     value N
1:     A 0.2655087 3
2:     A 0.3721239 3
3:     A 0.5728534 3

x嗨,akrun,如果我的问题措辞不正确,很抱歉。这对于x=1非常有效,但对于x=3则不行,在这种情况下,我希望所有组都保持不变。这对数据表也是可行的吗?谢谢!这正是我想要的。因此,在一行中变成:
dt[,groupcount:=.N,group][group%in%dt[顺序(-groupcount),unique(group)][1:x]
@Florian-您甚至可以将顺序也放入链中
dt[,groupcount:=.N,group][order(-groupcount)][groupcount==(最大值(groupcount)),][group%in%unique(组)[1:x]
Oops,不知道那是怎么滑进去的。更正。另一个选项:
dt[dt[order(-groupcount),unique(group)[seq_len(x)],on=“group”]
这更干净了,谢谢lmo!这是一个非常好的解决方案。或者
dt[dt[,.N,by=group][order(-N),head(group,x)],on=(group)]