假设我有一个具有以下结构的数据帧:
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)
使用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)
编辑以包含简要说明:
两种方法基本相同:
在data.table版本中,您首先setDT(df)将data.frame转换为data.table对象.
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |