我有一个数据集如下:
> head(data)
Symbol Date Close
1 A 2009-01-01 15.63
2 AA 2009-01-01 11.26
3 AAP 2009-01-01 33.65
4 AAV 2009-01-01 4.21
5 AB 2009-01-01 20.79
6 ABB 2009-01-01 15.01
数据$ Symbol中有大约2500个唯一标识符。我需要将其转换为如下所示,其中日期保持在左侧,但每个符号都有其单独的列。请注意,某些符号将包含一些没有数据的日期。
Date A AA AAP AAV.....
1 2009-01-01 15.63 11.26 33.65 4.21...
2 2009-01-02 15.26 11.25 33.62 3.88
3 2009-01-03 16.23 11.05 34.63 4.05
4 2009-01-04 16.21 11.72 35.19 4.35
...and so on
我尝试了很多东西,最后决定使用split函数将每个数据移动到一个单独的数据框中,然后将每个数据转换为xts对象,我将使用xts merge函数。我面临的问题是我试图使用字符串作为变量名,但它不起作用,虽然我尝试过get,assign,但我得到的只是一个错误。我的代码如下:
t1 <- unique(data$Symbol)
head(t1)
blocks <- split(data,data$Symbol)
for (i in 1:length(t1) ) {
symb= t1[i]
zclose <-paste("blocks$",symb,"$Close",sep="")
zdate <- paste("blocks$",symb,"$Date",sep="")
assign(paste("DataFor",symb,sep=""), xts(zclose,zdate))
}
最后一部分出错“xts中的错误(zclose,zdate): order.by需要一个合适的基于时间的对象“。
如果我要对名称进行硬编码,例如阻止$ AA $关闭并阻止$ AA $ Date,它就有效;但如果这些变量名分别包含在zclose和zdate中的字符串中,则不会。
非常感谢您阅读,如果您到目前为止与我在一起。对于R来说还是比较新的,所以我们会感激任何指针。
答案 0 :(得分:2)
您可以使用reshape2
包将数据从长格式转换为宽格式。然后将其转换为xts
require(reshape2)
require(xts)
data
## Date Symbol Close
## 1 2009-01-01 A 15.63
## 2 2009-01-02 A 15.26
## 3 2009-01-03 A 16.23
## 4 2009-01-04 A 16.21
## 5 2009-01-01 AA 11.26
## 6 2009-01-02 AA 11.25
## 7 2009-01-03 AA 11.05
## 8 2009-01-04 AA 11.72
## 9 2009-01-01 AAP 33.65
## 10 2009-01-02 AAP 33.62
## 11 2009-01-03 AAP 34.63
## 12 2009-01-04 AAP 35.19
## 13 2009-01-01 AAV 4.21
## 14 2009-01-02 AAV 3.88
## 15 2009-01-03 AAV 4.05
## 16 2009-01-04 AAV 4.35
tmp <- dcast(data = data, formula = Date ~ Symbol)
Using Close as value column: use value.var to override.
RES <- xts(x = tmp[, -1], order.by = as.Date(tmp[, 1]))
RES
## A AA AAP AAV
## 2009-01-01 15.63 11.26 33.65 4.21
## 2009-01-02 15.26 11.25 33.62 3.88
## 2009-01-03 16.23 11.05 34.63 4.05
## 2009-01-04 16.21 11.72 35.19 4.35
str(RES)
## An ‘xts’ object on 2009-01-01/2009-01-04 containing:
## Data: num [1:4, 1:4] 15.6 15.3 16.2 16.2 11.3 ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:4] "A" "AA" "AAP" "AAV"
## Indexed by objects of class: [Date] TZ: UTC
## xts Attributes:
## NULL
答案 1 :(得分:1)
dcast
中的{p> reshape2
应该有所帮助:
library(reshape2)
dat <- structure(list(Symbol = structure(1:6, .Label = c("A", "AA",
"AAP", "AAV", "AB", "ABB"), class = "factor"), Date = structure(c(1L,
1L, 1L, 1L, 1L, 1L), .Label = "2009-01-01", class = "factor"),
Close = c(15.63, 11.26, 33.65, 4.21, 20.79, 15.01)), .Names =
c("Symbol", "Date", "Close"), class = "data.frame", row.names = c(NA, -6L))
dcast(dat, Date ~ Symbol)
## Date A AA AAP AAV AB ABB
## 1 2009-01-01 15.63 11.26 33.65 4.21 20.79 15.01
答案 2 :(得分:1)
在不加载任何其他包的情况下,您可以split
Symbol
,然后使用lapply
向每个组应用函数(创建xts
对象)并返回一个xts对象列表。最后,您可以将do.call
merge
列表用于单个xts
。 (do.call(merge, L)
相当于merge(L[[1]], L[[2]], ..., L[[n]])
)
do.call(merge,
lapply(split(data, data$Symbol),
function(x) with(x, xts(Close, as.Date(Date),
dimnames=list(NULL, Symbol)))))
# A AA AAP AAV AB ABB
#2009-01-01 15.63 11.26 33.65 4.21 20.79 15.01
我使用dimnames
来命名列,这无疑是显而易见的。