简明 R data.table 模态值(最常见)组语法

Concise R data.table syntax for modal value (most frequent) by group

什么是高效优雅的 data.table 语法来为每个 ID 查找最常见的类别?我保留一个指示 NA 位置的布尔向量(用于其他目的)

dt = data.table(id=rep(1:2,7), category=c("x","y",NA))
print(dt)

在这个玩具示例中,忽略 NA,xid==1 的常见类别,yid==2 的常见类别。

如果你想忽略 NA,你必须先用 !is.na(category) 排除它们,按 idcategory 分组(by = .(id, category) ) 并使用 .N:

创建一个频率变量
 dt[!is.na(category), .N, by = .(id, category)]

给出:

   id category N
1:  1        x 3
2:  2        y 3
3:  2        x 2
4:  1        y 2

通过 id 订购这个会给你一个更清晰的画面:

 dt[!is.na(category), .N, by = .(id, category)][order(id)]

这导致:

   id category N
1:  1        x 3
2:  1        y 2
3:  2        y 3
4:  2        x 2

如果您只想要表示最高结果的行:

dt[!is.na(category), .N, by = .(id, category)][order(id, -N), head(.SD,1), by = id]

或:

dt[!is.na(category), .N, by = .(id, category)][, .SD[which.max(N)], by = id]

两者都给出:

   id category N
1:  1        x 3
2:  2        y 3