2014-02-12 57 views
1

我想创建一个data.frame(我知道矩阵会更快,但我需要一个data.frame),但它需要很长时间(超过30分钟)。我确信有比我已经尝试过的更好的方法。矢量化数据框的创建?

我有一个大对象(好吧,在磁盘上之前没有那么大〜= 100MB大小read.csv())是这样的:

  Date City V3 V4 
1 2008-12-30 NewYork 15 54 
2 2008-12-31 NewYork 16 34 
[...] 
4001 2008-12-30 London 12 12 
4002 2008-12-31 London 16 44 
[...] 
9001 2008-12-30 Madrid 26 54 
9002 2008-12-31 Madrid 64 23 

...可以想象很多城市(更超过500)和很多日期(20年的日常数据,但有时在不规则的时间序列中(也就是说,马德里可能是唯一在2001-01-01有意见的城市))。

我要的是一个data.frame安排他们,使该行的名称将是日期和列名的城市名称,像这样的:

  NewYorkV3 LondonV3 MadridV3 
2008-12-30   15  12  26 
2008-12-31   16  16  64 

我已经试过(欲盖弥彰最终对象的增长)是:

uniqs <- unique(city.data[ ,2]) 

city.list <- vector('list', length(uniqs)) 

for (i in 1:length(uniqs)) { 
city.list[[i]] <- subset(city.data, City==as.character(uniqs[i]))[ ,3] 
} 

city.df <- do.call('cbind', city.list) 

我确定有一种更有效的方法,但是这是什么?

我可以加载对象为xts吗?怎么样?我遇到了我无法理解的错误... Can Dates的列可以具有相同的值吗?

我可以融化并重塑物体吗?怎么样? (再次出错)

谢谢!

回答

3

您可能也有兴趣使用data.tabledcast.data.table延伸reshape2

这需要data.table版本1.8.11(从R-锻)

library(reshape2) 
library(data.table) 

dcast(x, Date ~ City, value.var = 'V3') 
2

reshape作品这样的:

reshape(x, direction="wide", timevar="City", idvar="Date") 
     Date V3.NewYork V4.NewYork V3.London V4.London V3.Madrid V4.Madrid 
1 2008-12-30   15   54  12  12  26  54 
2 2008-12-31   16   34  16  44  64  23 
0

你们很快。

我有一些问题与日期列,但我没有

current.city.data$V1 <- as.character(current.city.data$V1) 

,一切都解决了,然后(也可以做到这一点,而无论如何读它)

谢谢。