什么是高效优雅的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
。
答案 0 :(得分:5)
如果您想忽略NA
,则必须先使用!is.na(category)
,id
分组category
和by = .(id, category)
({{1} })并使用.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