Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据R中一个步骤中出现的频率聚合分类data.table列_R_Data.table_Aggregate_Frequency_Categorical Data - Fatal编程技术网

根据R中一个步骤中出现的频率聚合分类data.table列

根据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

我得到了一个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   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]