R中最快的高-宽旋转

本教程将介绍R中最快的高-宽旋转的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

R中最快的高-宽旋转 教程 第1张

问题描述

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

datevariablevalue
1970-01-01V10.434
1970-01-01V212.12
1970-01-01V3921.1
1970-01-02V1-1.10
1970-01-03V30.000
1970-01-03V5312e6
... ...  ...

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

dateV1V2V3V4V51970-01-010.43412.12921.1NANA
1970-01-02-1.10NANANANA
1970-01-030.000NANANA312e6

我希望以尽可能快的方式完成此操作,因为我必须在包含1e6条记录的表上重复该操作。在R原生模式中,我认为tapply()reshape()d*ply()都由data.table控制速度。我想用基于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.0311.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中最快的高-宽旋转的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。