根据R中一个步骤中出现的频率聚合分类data.table列
我得到了一个data.DT表,其中有数百万行和相当多的列。 我想同时聚合不同列上的data.table。一列“Var”是一个分类变量,我希望以一种方式对其进行聚合,以选择出现次数最多的条目根据R中一个步骤中出现的频率聚合分类data.table列,r,data.table,aggregate,frequency,categorical-data,R,Data.table,Aggregate,Frequency,Categorical Data,我得到了一个data.DT表,其中有数百万行和相当多的列。 我想同时聚合不同列上的data.table。一列“Var”是一个分类变量,我希望以一种方式对其进行聚合,以选择出现次数最多的条目 > require(data.table) > DT <- data.table(ID = c(1,1,1,1,2,2,2,3,3), Var = c('A', 'B', 'B', 'B', 'C', 'C', 'A', 'A', 'A')) > DT ID Var 1: 1
> require(data.table)
> DT <- data.table(ID = c(1,1,1,1,2,2,2,3,3), Var = c('A', 'B', 'B', 'B', 'C', 'C', 'A', 'A', 'A'))
> DT
ID Var
1: 1 A
2: 1 B
3: 1 B
4: 1 B
5: 2 C
6: 2 C
7: 2 A
8: 3 A
9: 3 A
我知道我可以分两步来做。首先,通过聚合每个ID和Var的发生次数,然后选择具有最大频率的行:
> ## I know this works but it involves more than one step:
> step1 <- DT[,.( freq = .N), by=.(ID, Var)]
> step1
ID Var freq
1: 1 A 1
2: 1 B 3
3: 2 C 2
4: 2 A 1
5: 3 A 2
> step2 <- step1[, .(Var_agg = Var[which.max(freq)]), by = .(ID)]
> step2
ID Var_agg
1: 1 B
2: 2 C
3: 3 A
###我知道这是可行的,但它涉及多个步骤:
>步骤1步骤1
ID变量频率
1:1A
2:1 B 3
3:2c2
4:2A.1
5:3 A 2
>步骤2步骤2
ID Var_agg
1:1 B
2:2 C
3:3 A
如果可能的话,我正在寻找一种一步到位的方法?
原因是我需要为这个表做很多其他聚合,但是其他聚合都涉及一个步骤,如果我不必为这个列单独做聚合,那就太好了,这样我就可以将它与其他列的聚合一起包含。此问题是一个代码优化问题。我只对data.table操作感兴趣,而不是其他包。创建一个用于计算
模式的函数,并按模式进行分组
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
DT[, .(agg_Var = Mode(Var)), ID]
模式高效干净,谢谢。如果模式函数可以添加到基本的R函数中,比如均值和中值,那就太好了!
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
DT[, .(agg_Var = Mode(Var)), ID]