r - R 中最快的 Tall-Wide 旋转

标签 r sqlite data.table plyr reshape

我正在处理一个简单的表格

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
...          ...        ...

对(日期、变量)是唯一的。我想把这张表改成宽表。

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

而且我想以尽可能快的方式进行,因为我必须对具有 1e6 条记录的表重复重复该操作。在 R 原生模式下,我相信 tapply()reshape()d*ply() 都在速度方面由 数据表。我想针对基于 sqlite 的解决方案(或其他数据库)测试后者的性能。这是以前做过的吗?有性能提升吗?而且,当“宽”字段(日期)的数量可变且事先未知时,如何在 sqlite 中将高转换为宽?

最佳答案

我使用的方法基于 tapply 所做的事情,但速度快了一个数量级(主要是因为没有每个单元格的函数调用)。

使用 Prasad 帖子中的 tall 的时间:

pivot = function(col, row, value) {
  col = as.factor(col)
  row = as.factor(row)
  mat = array(dim = c(nlevels(row), nlevels(col)), dimnames = list(levels(row), levels(col)))
  mat[(as.integer(col) - 1L) * nlevels(row) + as.integer(row)] = value
  mat
}

> system.time( replicate(100, wide <- with(tall, tapply( value, list(dt,tkr), identity))))
   user  system elapsed 
  11.31    0.03   11.36 

> system.time( replicate(100, wide <- with(tall, pivot(tkr, dt, value))))
   user  system elapsed 
    0.9     0.0     0.9 

关于排序可能出现的问题,应该没有问题:

> a <- with(tall, pivot(tkr, dt, value))
> b <- with(tall[sample(nrow(tall)), ], pivot(tkr, dt, value))
> all.equal(a, b)
[1] TRUE

关于r - R 中最快的 Tall-Wide 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5307313/

相关文章:

用 R 中该行的最新非 NA 值替换特定列中的 NA

r - 在R中将raw转换为long?

r - 文件中的错误(文件, "rt"): cannot open the connection - cannot open file 'specdata' access denied

r - 如何将简单的文本表达式转换为 R 中的数学表达式

python - 如何将 Flask 应用程序连接到在 Docker 中运行的 SQLite DB?

r - data.table 解决方案,用于删除 NA 超过一定百分比的变量

r - Python LDA gensim "DeprecationWarning: invalid escape sequence"

c++ - 为什么 sqlite3pp 样本会这样?

sqlite - 适用于 Windows 7 64 位的 DLL 文件

R data.table 对函数参数执行连接