矢量化数据框创建?

时间:2014-02-12 23:17:26

标签: r vectorization

我想创建一个data.frame(我知道矩阵会更快,但我需要一个data.frame)但是它需要太长时间(超过30分钟)。我相信有一种比我已经尝试过的更好的方式。

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

           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中,以便行名称为Dates,列名称为城市名称,如下所示:

            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吗?怎么样?我得到了我无法理解的错误...... 日期列可以具有相同的值吗?

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

谢谢!

3 个答案:

答案 0 :(得分:3)

您可能也有兴趣使用data.tabledcast.data.table扩展reshape2

这需要data.table版本1.8.11(来自R-forge)

library(reshape2)
library(data.table)

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

答案 1 :(得分: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

答案 2 :(得分:0)

你们这些人非常快。

我在Date列中遇到了一些问题,但我做了

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

然后一切都解决了(无论如何也可以这样做)

谢谢。