根据 R 中一步中的出现频率聚合分类 data.table 列
Aggregate a categorical data.table column based on frequency of occurrence in one step in R
我有一个 data.table 具有数百万行和相当多列的 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 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
我想要的输出是:
> desired_output
ID agg_Var
1: 1 B # B occurred the most for ID = 1
2: 2 C # C occurred the most for ID = 2
3: 3 A # A occurred the most for ID = 3
我知道我可以分两步完成。首先汇总每个 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
如果可能,我正在寻找一种一步完成此操作的方法?
原因是我需要为此 table 做很多其他聚合,但其他聚合都涉及一个步骤,如果我不必为此专栏进行单独的聚合,那就太好了,这样我就可以将它包含在其他列的聚合中。这个问题是代码优化问题。我只对 data.table 操作感兴趣,对其他包不感兴趣。
创建用于计算 Mode
的函数并按 Mode
进行分组
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
DT[, .(agg_Var = Mode(Var)), ID]
我有一个 data.table 具有数百万行和相当多列的 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 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
我想要的输出是:
> desired_output
ID agg_Var
1: 1 B # B occurred the most for ID = 1
2: 2 C # C occurred the most for ID = 2
3: 3 A # A occurred the most for ID = 3
我知道我可以分两步完成。首先汇总每个 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
如果可能,我正在寻找一种一步完成此操作的方法? 原因是我需要为此 table 做很多其他聚合,但其他聚合都涉及一个步骤,如果我不必为此专栏进行单独的聚合,那就太好了,这样我就可以将它包含在其他列的聚合中。这个问题是代码优化问题。我只对 data.table 操作感兴趣,对其他包不感兴趣。
创建用于计算 Mode
的函数并按 Mode
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
DT[, .(agg_Var = Mode(Var)), ID]