2017-06-08 28 views
1

在数据框中的多个列或R中的data.table中计算组索引(组标识符)的最有效方法是什么?计算R中一个数据帧的多个列的组索引

例如,在以下的数据帧,也有和B列A的六个独特组合

DF <- data.frame(a = rep(1:2,6), b = sort(letters[1:3])) 

> DF 
    a b 
1 1 a 
2 2 b 
3 1 c 
4 2 a 
5 1 b 
6 2 c 
7 1 a 
8 2 b 
9 1 c 
10 2 a 
11 1 b 
12 2 c 

我想添加列“索引”的一组标识符,如所产生的一个这个(大数据帧明显低效的方法):

DF$index <- with(DF, as.numeric(factor(paste0(a, b)))) 

> DF 
    a b index 
1 1 a  1 
2 2 b  5 
3 1 c  3 
4 2 a  4 
5 1 b  2 
6 2 c  6 
7 1 a  1 
8 2 b  5 
9 1 c  3 
10 2 a  4 
11 1 b  2 
12 2 c  6 

什么是非常大的数据帧做到这一点的最快方法?

+0

对于非常大的数据使用' data.ta ble' https://stackoverflow.com/tags/data.table/info – jogo

回答

2

这个怎么样使用data.table

library(data.table) 
setDT(df)[,group :=.GRP,by = .(a,b)] 

输出

> df 
    a b group 
1: 1 a  1 
2: 2 b  2 
3: 1 c  3 
4: 2 a  4 
5: 1 b  5 
6: 2 c  6 
7: 1 a  1 
8: 2 b  2 
9: 1 c  3 
10: 2 a  4 
11: 1 b  5 
12: 2 c  6 
1

在基础R,您可以使用interaction,这比paste方法相当快一点,虽然data.table方法仍然更快。

DF$index <- as.integer(interaction(DF)) 

这将返回所希望的结果

DF 
    a b index 
1 1 a  1 
2 2 b  4 
3 1 c  5 
4 2 a  2 
5 1 b  3 
6 2 c  6 
7 1 a  1 
8 2 b  4 
9 1 c  5 
10 2 a  2 
11 1 b  3 
12 2 c  6 

定时

这里是一个更大的数据集的一些定时:

### set up 
# 60K observations 
DF <- data.frame(a = rep(1:2,60000), b = letters[1:20]) 
# make a data table copy 
library(data.table) 
DT <- data.table(DF) 

library(microbenchmark) 
microbenchmark(paste=with(DF, as.numeric(factor(paste0(a, b)))), 
       interaction=as.integer(interaction(DF)), 
       grp=DT[,group :=.GRP,by = .(a,b)]) 
Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval cld 
     paste 38.664541 41.100587 46.315671 42.030301 42.903709 91.32412 100 c 
interaction 4.203244 5.788548 9.927459 6.141646 6.943635 55.15564 100 b 
     grp 1.771617 1.897632 2.772984 2.138828 2.218371 49.41399 100 a 
相关问题