假设我有一个具有以下结构的数据框:
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
我想为每个A
在B
和id
中获取最常见的值组合:
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
答案 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
编辑以包含简要说明:
两种方法基本相同:
在data.table版本中,您从setDT(df)
开始将data.frame转换为data.table对象。