透视大型数据集

时间:2015-07-03 12:20:15

标签: r pivot pivot-table

我有一个看起来有点像这样的csv(为了便于阅读而添加了标签):

::

我想进行一些距离+ hclust分析,这是我以前做过的。但我喜欢(也许需要)这种格式:

var keyDowns = rx.Observable.fromEvent(document, 'keydown');
var keyUps = rx.Observable.fromEvent(document, 'keyup'); 
var keyActions = rx.Observable.merge(keyDowns, keyUps);

keyActions.subscribe(function(e) {
    console.log e
});

我可以使用数据透视表在Excel中轻松完成此操作。问题是我有~1,000个维度和〜1,200个日期 - 所以源CSV大约是12M行乘3列。我希望~1,000行〜1,200列。

有没有办法可以在R中进行这种转换?一个小Python脚本的逻辑很简单,但我不确定它将如何处理如此大的CSV - 我无法想象这是一个新问题。不想重新发明轮子!

感谢您的任何提示:)

2 个答案:

答案 0 :(得分:9)

或只是spread

library(tidyr)
spread(df, Date, Metric)
  Dimension Mon Tues
1         a  23   25
2         b   7    9

基准

 library(microbenchmark)
 microbenchmark(spread(df, Date, Metric))
Unit: milliseconds
                     expr      min       lq     mean   median       uq      max neval
 spread(df, Date, Metric) 1.461595 1.491919 1.628366 1.566753 1.635374 2.606135   100
 microbenchmark(suppressMessages(dcast(dt, Dimension~Date)))
Unit: milliseconds
                                          expr      min       lq     mean   median       uq      max neval
 suppressMessages(dcast(dt, Dimension ~ Date)) 3.365726 3.416384 3.770659 3.471678 4.011316 7.235719   100

microbenchmark(suppressMessages(dcast.data.table(dt, Dimension~Date)))
Unit: milliseconds
                                                 expr      min      lq   

mean   median       uq
 suppressMessages(dcast.data.table(dt, Dimension ~ Date)) 2.375445 2.52218 2.7684 2.614706 2.703075
      max neval
 15.96149   100

此处没有sppressMessages

的数据表
Unit: milliseconds
                                   expr      min       lq     mean median       uq     max neval
 dcast.data.table(dt, Dimension ~ Date) 2.667337 3.428127 4.749301 4.0476 5.289618 14.3823   100

这里数据表不必猜测:

 microbenchmark(dcast.data.table(dt, Dimension ~ Date, value.var = "Metric"))
Unit: milliseconds
                                                         expr      min       lq    mean   median
 dcast.data.table(dt, Dimension ~ Date, value.var = "Metric") 2.077276 2.118707 2.28623 2.168667
       uq      max neval
 2.320579 5.780479   100

答案 1 :(得分:3)

试试吧:

library(data.table)
dt = data.table(Dimension=rep(letters[1:2], each=2), Date=c('Mon','Tues'), Metric=c(23,25,7,9))

dcast(dt, Dimension~Date)
#  Dimension Mon Tues
#1         a  23   25
#2         b   7    9