我最近开始在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个最大的组。
答案 0 :(得分: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个最大组的位置。然后,生成的数据框将按组连接到原始数据框上。
答案 1 :(得分:2)
我们可以做到
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)}]]
答案 2 :(得分:2)
如何使用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] ]