按组计算众数(最频繁出现的值)的简洁R data.table语法

3
什么是用于查找每个id最常见类别的高效优雅的data.table语法?我保留一个布尔向量,用于指示NA位置(用于其他目的)。
dt = data.table(id=rep(1:2,7), category=c("x","y",NA))
print(dt)

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

6

如果你想忽略NA的值,你需要首先使用!is.na(category)将其排除,然后按照idcategoryby = .(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

这可能会导致删除只有NAs的组,顺便说一句...在这种情况下,可以将它们重新加入或其他什么 dt[!is.na(category)][, .N, by=.(id, category)][order(-N)][.(unique(dt$id)), on=.(id), .SD[1L], by=id] 或者只是给非NAs优先排序:dt[, .N, by=.(id, category)][order(is.na(category), -N), .SD[1L], by=id] - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接