计算R

时间:2017-06-08 17:38:47

标签: r

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

例如,在下面的数据框中,列A和B有六种独特的组合。

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

我想添加一个带有组标识符的列'index',就像这个产生的那样(对于大数据帧来说效率显然很低):

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

使用非常大的数据帧执行此操作的最快方法是什么?

2 个答案:

答案 0 :(得分: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 :(得分: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