R data.table查找一组数据的模式

bro*_*oli 5 r data.table

我有以下数据表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级别?还是一些类似的技巧,也许可以在上面显示的第一步中使我高效而迅速地做到这一点?提前致谢

Aru*_*run 7

我会这样:

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与列id1freq。这将按freq升序排序。这样,我们就可以进行by-without-by子设置并将其与mult="last"(因为对于每个组,最后一个值将是最大的,因为它按升序排序)。

这将为sort每个分组节省一个步骤,随着分组数量的增加,这可能会变得很耗时。请注意,这不处理联系。也就是说,如果您具有相同的id1两个相等的最大值,那么将仅返回一个。