汇总名称以模式开头的所有列的最有效方法是什么?

罗德里戈

我的目标是要总结在与前缀开头列所有值skill_data.table我希望使用一种解决方案,data.table但我并不挑剔。

到目前为止,我的解决方案是:

> require(data.table)
> DT <- data.table(x=1:4, skill_a=c(0,1,0,0), skill_b=c(0,1,1,0), skill_c=c(0,1,1,1))
> DT[, row_idx := 1:nrow(DT)]
> DT[, count_skills := 
          sapply(1:nrow(DT), 
                 function(id) sum(DT[row_idx == id, 
                                     grepl("skill_", names(DT)), with=FALSE]))]

> DT
   x skill_a skill_b skill_c row_idx count_skills
1: 1       0       0       0       1            0
2: 2       1       1       1       2            3
3: 3       0       1       1       3            2
4: 4       0       0       1       4            1

但是,当DT很大时,这变得非常慢。有没有更有效的方法可以做到这一点?

深的

关于效率和性能的问题总是值得参考的。

数据的大小非常重要,因为增长率会产生巨大的差异。

相对时间2 ^ 4和2 ^ 24之间的相对基准时间。
沿尺寸floor( 2^logb(10^( seq( 4, 24, .5 ) ), 10 ) )

摘录了100万行的基准...

## Unit: milliseconds
##             expr    min     lq median    uq   max neval
##    dplyr.sol(DT) 21.803 50.260 51.765 52.45 73.30   100
##  rowSums.sol(DT) 20.759 50.224 51.418 52.56 96.28   100
##   SDCols.sol(DT)  7.250  8.916 37.699 38.50 52.69   100
##     eval.sol(DT)  6.883  7.007  7.916  9.45 50.91   100

eval.sol 是一个利用data.table对表达式进行处理的答案,在以下来源中...

library(compiler)
library(data.table)
suppressMessages(library(dplyr))
library(microbenchmark)

buildDT <- function(reps) {
  data.table(x=seq_len(reps*4),
               skill_a=rep(c(0,1,0,0),reps),
               skill_b=rep(c(0,1,1,0),reps),
               skill_c=rep(c(0,1,1,1),reps))
}

OP.sol <- function(DT) {
  DT[, row_idx := 1:nrow(DT)]
  DT[, count_skills := 
          sapply(1:nrow(DT), 
                 function(id) sum(DT[row_idx == id, 
                                     grepl("skill_", names(DT)), with=FALSE]))]
}

dplyr.sol <- function(DT)
  DT %.% select(starts_with("skill_")) %.% rowSums()

SDCols.sol <- function(DT)
  DT[, Reduce(`+`, .SD),
     .SDcols = grep("skill_", names(DT), value = T)]

rowSums.sol <- function(DT)
  rowSums(DT[,grep("skill_", names(DT)),with=FALSE])

eval.sol <- function(DT) {
  cmd <- parse(text=paste(colnames(DT)[grepl("^skill_", colnames(DT))],collapse='+') )
  DT[,eval(cmd)]
}

DT <- buildDT(1)
identical(OP.sol(DT)$count_skills, dplyr.sol(DT))

## [1] TRUE

identical(OP.sol(DT)$count_skills, rowSums.sol(DT))

## [1] TRUE

identical(OP.sol(DT)$count_skills, SDCols.sol(DT))

## [1] TRUE

identical(OP.sol(DT)$count_skills, eval.sol(DT))

## [1] TRUE

DT<-buildDT(2500)
nrow(DT)

## [1] 10000

microbenchmark( # OP.sol(DT), forget this method.
                dplyr.sol(DT),
                rowSums.sol(DT),
                SDCols.sol(DT),
                eval.sol(DT),
                times=100)

## Unit: microseconds
##             expr   min    lq median    uq   max neval
##    dplyr.sol(DT) 760.1 809.0  848.2 951.5  2276   100
##  rowSums.sol(DT) 580.5 605.3  627.6 745.7 28481   100
##   SDCols.sol(DT) 559.8 610.5  638.8 694.0  2016   100
##     eval.sol(DT) 636.4 677.7  692.4 740.5  2021   100

DT<-buildDT(25000)
nrow(DT)

## [1] 100000

microbenchmark( # OP.sol(DT), forget this method.
                dplyr.sol(DT),
                rowSums.sol(DT),
                SDCols.sol(DT),
                eval.sol(DT),
                times=100)

## Unit: milliseconds
##             expr   min    lq median    uq   max neval
##    dplyr.sol(DT) 2.668 3.744  4.045 4.573 33.87   100
##  rowSums.sol(DT) 2.455 3.339  3.756 4.235 34.19   100
##   SDCols.sol(DT) 1.253 1.401  2.179 2.392 31.72   100
##     eval.sol(DT) 1.294 1.427  2.116 2.484 32.02   100

DT<-buildDT(250000)
nrow(DT)

## [1] 1000000

microbenchmark( # OP.sol(DT), forget this method.
                dplyr.sol(DT),
                rowSums.sol(DT),
                SDCols.sol(DT),
                eval.sol(DT),
                times=100)

## Unit: milliseconds
##             expr    min     lq median    uq   max neval
##    dplyr.sol(DT) 21.803 50.260 51.765 52.45 73.30   100
##  rowSums.sol(DT) 20.759 50.224 51.418 52.56 96.28   100
##   SDCols.sol(DT)  7.250  8.916 37.699 38.50 52.69   100
##     eval.sol(DT)  6.883  7.007  7.916  9.45 50.91   100

identical(dplyr.sol(DT), rowSums.sol(DT))

## [1] TRUE

identical(dplyr.sol(DT), SDCols.sol(DT))

## [1] TRUE

identical(dplyr.sol(DT), eval.sol(DT))

## [1] TRUE

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将最高有效设置位以下的所有位归零的最有效方法是什么?

来自分类Dev

删除/终止Apache Pulsar主题中的所有消息的最有效方法是什么?

来自分类Dev

从Elasticsearch获得所有结果的最有效方法是什么?

来自分类Dev

总结前几年所有观察结果的最有效方法是什么

来自分类Dev

在iOS中显示具有多列的表的最有效方法是什么?

来自分类Dev

过滤单个资源最有效的方法是什么?

来自分类Dev

使wifi工作最有效的方法是什么?

来自分类Dev

读取大文件的最有效方法是什么?

来自分类Dev

列出目录的最有效方法是什么?

来自分类Dev

遍历图片像素的最有效方法是什么

来自分类Dev

获取数字总和的最有效方法是什么?

来自分类Dev

在Haxe中循环最有效的方法是什么?

来自分类Dev

使wifi工作最有效的方法是什么?

来自分类Dev

Emacs:删除报价最有效的方法是什么?

来自分类Dev

筛选搜索的最有效方法是什么?

来自分类Dev

检测nmap扫描的最有效方法是什么?

来自分类Dev

绘制网格最有效的方法是什么?

来自分类Dev

处理 eventListener 的最有效方法是什么?

来自分类Dev

Python:打印列表的最有效方法是什么?

来自分类Dev

在最小化浮点误差的同时,在numpy中汇总ndarray的最有效方法是什么?

来自分类常见问题

创建两个熊猫数据框列的字典的最有效方法是什么?

来自分类Dev

在R中删除数据表中空列的最有效方法是什么

来自分类Dev

更正列中文本类型数据的最有效方法是什么?

来自分类Dev

在 DataTable 列中计算总数的最有效方法是什么

来自分类Dev

将列的值按特定顺序排序的最有效方法是什么?

来自分类Dev

查找值 X 不在 Y 列中的记录的最有效方法是什么?

来自分类Dev

在javascript中获取数字的最低有效位的最有效方法是什么?

来自分类Dev

MySQL:从RBAC数据库检索所有权限的最有效方法是什么?

来自分类Dev

PyAudio:在回调模式下使用的最有效的格式和打包/解包方法是什么?

Related 相关文章

  1. 1

    将最高有效设置位以下的所有位归零的最有效方法是什么?

  2. 2

    删除/终止Apache Pulsar主题中的所有消息的最有效方法是什么?

  3. 3

    从Elasticsearch获得所有结果的最有效方法是什么?

  4. 4

    总结前几年所有观察结果的最有效方法是什么

  5. 5

    在iOS中显示具有多列的表的最有效方法是什么?

  6. 6

    过滤单个资源最有效的方法是什么?

  7. 7

    使wifi工作最有效的方法是什么?

  8. 8

    读取大文件的最有效方法是什么?

  9. 9

    列出目录的最有效方法是什么?

  10. 10

    遍历图片像素的最有效方法是什么

  11. 11

    获取数字总和的最有效方法是什么?

  12. 12

    在Haxe中循环最有效的方法是什么?

  13. 13

    使wifi工作最有效的方法是什么?

  14. 14

    Emacs:删除报价最有效的方法是什么?

  15. 15

    筛选搜索的最有效方法是什么?

  16. 16

    检测nmap扫描的最有效方法是什么?

  17. 17

    绘制网格最有效的方法是什么?

  18. 18

    处理 eventListener 的最有效方法是什么?

  19. 19

    Python:打印列表的最有效方法是什么?

  20. 20

    在最小化浮点误差的同时,在numpy中汇总ndarray的最有效方法是什么?

  21. 21

    创建两个熊猫数据框列的字典的最有效方法是什么?

  22. 22

    在R中删除数据表中空列的最有效方法是什么

  23. 23

    更正列中文本类型数据的最有效方法是什么?

  24. 24

    在 DataTable 列中计算总数的最有效方法是什么

  25. 25

    将列的值按特定顺序排序的最有效方法是什么?

  26. 26

    查找值 X 不在 Y 列中的记录的最有效方法是什么?

  27. 27

    在javascript中获取数字的最低有效位的最有效方法是什么?

  28. 28

    MySQL:从RBAC数据库检索所有权限的最有效方法是什么?

  29. 29

    PyAudio:在回调模式下使用的最有效的格式和打包/解包方法是什么?

热门标签

归档