【问题标题】:Aggregate a categorical data.table column based on frequency of occurrence in one step in R [duplicate]根据R中一步的出现频率聚合分类data.table列[重复]
【发布时间】:2019-11-23 18:26:51
【问题描述】:

我得到了一个包含数百万行和很多列的 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

如果可能,我正在寻找一种方法来一步完成? 原因是我需要为这个表做很多其他聚合,但是其他聚合都涉及一个步骤,如果我不必为此列进行单独的聚合,那就太好了,这样我就可以只需将其包含在其他列的聚合中即可。这个问题是代码优化问题。我只对 data.table 操作感兴趣,而不是额外的包。

【问题讨论】:

    标签: r data.table aggregate frequency categorical-data


    【解决方案1】:

    创建一个计算Mode的函数并按Mode分组

    Mode <- function(x) {
      ux <- unique(x)
      ux[which.max(tabulate(match(x, ux)))]
    }
    
    DT[, .(agg_Var = Mode(Var)), ID]
    

    【讨论】:

    • 高效干净,谢谢。如果可以将模式函数添加到基本的 R 函数中,比如均值和中位数,那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2017-08-14
    • 2020-06-21
    • 2015-04-29
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多