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

时间:2015-02-12 21:14:39

标签: 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

我想为每个ABid中获取最常见的值组合:

id  A  B
 1  1  2
 2  3  5

我需要为相当大的数据集(数百万行)执行此操作。我有几个可怕的,缓慢的,非常惯用的解决方案;我确信有一种简单的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

1 个答案:

答案 0 :(得分: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

类似的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

编辑以包含简要说明:

两种方法基本相同:

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

在data.table版本中,您从setDT(df)开始将data.frame转换为data.table对象。