我有以下数据表x
id1 id2
a x
a x
a y
b z
Run Code Online (Sandbox Code Playgroud)
对于id1和id2的每种组合,我可以通过以下方式找到实例数
x[,list(
freq = .N
),by = "id1,id2"]
Run Code Online (Sandbox Code Playgroud)
以上将产生
a x 2
a y 1
b z 1
Run Code Online (Sandbox Code Playgroud)
接下来,我想为每个id1(即模式)找到最频繁的id2。所以预期的结果是
a x 2
b z 1
Run Code Online (Sandbox Code Playgroud)
我可以绕一圈到达那里,但是有没有办法将序列号放在id1级别?还是一些类似的技巧,也许可以在上面显示的第一步中使我高效而迅速地做到这一点?提前致谢
我会这样:
setkey(dt[, list(freq = .N), by=list(id1, id2)],
id1, freq)[J(unique(id1)), mult="last"]
id1 id2 freq
1: a x 2
2: b z 1
Run Code Online (Sandbox Code Playgroud)
这个想法是首先获得该freq列(就像您所做的那样)。然后setkey在结果data.table与列id1和freq。这将按freq升序排序。这样,我们就可以进行by-without-by子设置并将其与mult="last"(因为对于每个组,最后一个值将是最大的,因为它按升序排序)。
这将为sort每个分组节省一个步骤,随着分组数量的增加,这可能会变得很耗时。请注意,这不处理联系。也就是说,如果您具有相同的id1两个相等的最大值,那么将仅返回一个。