R中最快的高宽旋转

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中从高到宽进行转换?

Pra*_*ani 1

几点说明。有几个问题解决了如何在 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)