【问题标题】:Calculate a group index across multiple columns of a data frame in R [duplicate]在R中计算跨数据框多列的组索引[重复]
【发布时间】:2017-06-08 17:38:46
【问题描述】:

在 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

我想添加带有组标识符的列“索引”,就像由此产生的那样(对于大型数据帧显然效率低下):

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

对于非常大的数据帧,最快的方法是什么?

【问题讨论】:

标签: r


【解决方案1】:

如何使用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

【讨论】:

    【解决方案2】:

    在基础 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2015-12-15
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多