简明 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,x
是 id==1
的常见类别,y
是 id==2
的常见类别。
如果你想忽略 NA
,你必须先用 !is.na(category)
排除它们,按 id
和 category
分组(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
什么是高效优雅的 data.table 语法来为每个 ID 查找最常见的类别?我保留一个指示 NA 位置的布尔向量(用于其他目的)
dt = data.table(id=rep(1:2,7), category=c("x","y",NA))
print(dt)
在这个玩具示例中,忽略 NA,x
是 id==1
的常见类别,y
是 id==2
的常见类别。
如果你想忽略 NA
,你必须先用 !is.na(category)
排除它们,按 id
和 category
分组(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