我想创建一个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吗?怎么样?我得到了我无法理解的错误...... 日期列可以具有相同的值吗?
我能融化并重塑物体吗?怎么样? (再次出错)
谢谢!
答案 0 :(得分:3)
您可能也有兴趣使用data.table
和dcast.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)
然后一切都解决了(无论如何也可以这样做)
谢谢。