2017-06-08 49 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 
相關問題