gap*_*ppy 12 sqlite r plyr reshape data.table
我正在处理一个简单的表格表
date variable value
1970-01-01 V1 0.434
1970-01-01 V2 12.12
1970-01-01 V3 921.1
1970-01-02 V1 -1.10
1970-01-03 V3 0.000
1970-01-03 V5 312e6
... ... ...
Run Code Online (Sandbox Code Playgroud)
对(日期,变量)是唯一的.我想把这张桌子变成一张宽大的桌子.
date V1 V2 V3 V4 V5
1970-01-01 0.434 12.12 921.1 NA NA
1970-01-02 -1.10 NA NA NA NA
1970-01-03 0.000 NA NA NA 312e6
Run Code Online (Sandbox Code Playgroud)
我想以最快的方式做到这一点,因为我必须在具有1e6记录的表上重复操作.在R本机模式中,我相信这两者tapply(),reshape()并且d*ply()在速度方面占主导地位data.table.我想针对基于sqlite的解决方案(或其他数据库)测试后者的性能.以前做过吗?是否有性能提升?并且,当"宽"字段(日期)的数量可变且事先不知道时,如何在sqlite中从高到宽进行转换?
几点说明。有几个问题解决了如何在 Sql(ite) 中进行从高到宽的旋转:这里和这里。我没有太深入地研究这些,但我的印象是,在 SQL 中执行此操作很丑陋,例如:您的 sql 查询需要显式提及查询中所有可能的键!(如果我错了,请有人纠正我)。至于data.table,您绝对可以非常快地进行分组操作,但我不知道如何将结果实际转换为宽格式。
如果你想纯粹用 R 来做,我认为这里是速度冠军,比fromtapply快得多:acastreshape2
创建一些高数据,其中有一些漏洞只是为了确保代码做正确的事情:
tall <- data.frame( dt = rep(1:100, 100),
tkr = rep( paste('v',1:100,sep=''), each = 100),
value = rnorm(1e4)) [-(1:5), ]
> system.time( replicate(100, wide <- with(tall, tapply( value, list(dt,tkr), identity))))
user system elapsed
4.73 0.00 4.73
> system.time( replicate(100, wide <- acast( tall, tkr ~ dt)))
user system elapsed
7.93 0.03 7.98
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1237 次 |
| 最近记录: |