如何在data.frame中获取多个列的最常见组合,由其他列聚合?

jes*_*sta 4 r dataframe

假设我有一个具有以下结构的数据帧:

id  A  B
 1  1  1
 1  1  2
 1  1  2
 1  2  2
 1  2  3
 1  2  4
 1  2  5
 2  1  2
 2  2  2
 2  3  2 
 2  3  5 
 2  3  5 
 2  4  6
Run Code Online (Sandbox Code Playgroud)

我想获得的值的最常见的组合A,并B为每个id:

id  A  B
 1  1  2
 2  3  5
Run Code Online (Sandbox Code Playgroud)

我需要为一个相当大的数据集(数百万行)执行此操作.我有几个可怕的,缓慢的,非常惯用的解决方案; 我确信有一种简单的R-ish方式.

我想我应该使用aggregate,但我无法找到一种有效的方法:

> aggregate(cbind(A, B) ~ id, d, Mode)
  id A B
1  1 2 2
2  2 3 2  
> # wrong!

> aggregate(interaction(A, B) ~ id, d, Mode)
id interaction(A, B)
1  1               1.2
2  2               3.5
> # close, but I need the original columns
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 6

使用dplyr:

library(dplyr)
df %>% 
  group_by(id, A, B) %>%
  mutate(n = n()) %>%
  group_by(id) %>%
  slice(which.max(n)) %>%
  select(-n)

#Source: local data frame [2 x 3]
#Groups: id
#
#  id A B
#1  1 1 2
#2  2 3 5
Run Code Online (Sandbox Code Playgroud)

和类似的data.table方法:

library(data.table)
setDT(df)[, .N, by=.(id, A, B)][, .SD[which.max(N)], by = id]
#   id A B N
#1:  1 1 2 2
#2:  2 3 5 2
Run Code Online (Sandbox Code Playgroud)

编辑以包含简要说明:

两种方法基本相同:

  • 按ID,A和B对数据进行分组
  • 添加一个包含每组行数的列
  • 按id(仅)对数据进行分组,并返回每个id的(第一个)最大组.

在data.table版本中,您首先setDT(df)将data.frame转换为data.table对象.