按行将数据按行数移动到R中的列中

时间:2014-05-19 01:38:51

标签: r xts

我有一个数据集如下:

    > 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来说还是比较新的,所以我们会感激任何指针。

3 个答案:

答案 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来命名列,这无疑是显而易见的。