簡體   English   中英

僅使用data.table保留x個最大的組

[英]Keeping only the x largest groups with 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]

但現在我只想保持x組具有groupcount 我們假設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[, .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

聚合內部data.frame以計算觀察值,並使用x的值使用order子集檢索x個最大組的位置。 然后,生成的數據框將按組連接到原始數據框。

我們可以做的

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)}]]

如何使用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] ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM