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

时间:2015-12-21 19:31:57

标签: r data.table frequency

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

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

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

1 个答案:

答案 0 :(得分:5)

如果您想忽略NA,则必须先使用!is.na(category)id分组categoryby = .(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