2010-12-17 63 views
4

将具有混合因子和数字列的数据帧转换为xt时,我的所有数据都转换为字符串。这不是因素造成的问题,但它对数字非常恼人。有没有解决方法?R:将数据帧(混合因子和数字)转换为R中的XTS

例如:

> x 

      marketTimestamp price id 
1 2010-12-17 11:38:31.100 83.89 b-0 
2 2010-12-17 11:38:31.100 83.88 b-1 
3 2010-12-17 11:38:31.100 83.87 b-2 
4 2010-12-17 11:38:31.300 83.91 o-0 
5 2010-12-17 11:38:31.300 83.92 o-1 
6 2010-12-17 11:38:31.300 83.93 o-2 

> as.xts(x[,-1],as.POSIXct(x[,1])) 

        price id 
2010-12-17 11:38:31 "83.89" "b-0" 
2010-12-17 11:38:31 "83.88" "b-1" 
2010-12-17 11:38:31 "83.87" "b-2" 
2010-12-17 11:38:31 "83.91" "o-0" 
2010-12-17 11:38:31 "83.92" "o-1" 
2010-12-17 11:38:31 "83.93" "o-2" 

理想我想的第一列保持数字,而第二个被转换为字符串。解决方案需要完全自动化,因为我正在处理大量列的数据集,而且我不能总是预测哪些是因素,哪些是数字。

-

编辑:

我试图通过定义下面的函数来解决这个问题:

to.xts <- function(data) { 

    timestamp <- as.POSIXct(data[,1]) 
    coredata <- data[,-1] 

    headers <- names(coredata) 
    data.type <- c() 

    for (header in headers) { 
     data.type[headers==header] <- class(coredata[[header]]) 
    } 

    data.factor <- xts(coredata[,data.type=="factor"],timestamp) 
    data.numeric <- xts(coredata[,data.type=="numeric"],timestamp) 

    data.xts <- cbind(data.factor,data.numeric) 

} 

但合并两家XTS对象时,字符串数据转换为NAs:

> x 
        id side 
2010-12-17 11:38:31 "b-0" "BID" 
2010-12-17 11:38:31 "b-1" "BID" 
2010-12-17 11:38:31 "b-2" "BID" 
> y 
        price 
2010-12-17 11:38:31 83.89 
2010-12-17 11:38:31 83.88 
2010-12-17 11:38:31 83.87 
> merge(x,y) 
        id side price 
2010-12-17 11:38:31 NA NA 83.89 
2010-12-17 11:38:31 NA NA 83.88 
2010-12-17 11:38:31 NA NA 83.87 
Warning message: 
In merge.xts(x, y) : NAs introduced by coercion 

这是XTS软件包的已知问题,或者难道我做错了什么?

回答

6

你不能这样做,因为xts需要一个数字矩阵。

+0

啊,谢谢。我必须找到解决方法。 – 2010-12-17 14:36:19

+2

更具体一些:zoo/xts是一个矩阵加一个索引属性,并且不能混合矩阵中的类型。 – 2010-12-17 14:44:44

+0

是的,但是这个OP的错误一次不是索引类型,而是底层的有效载荷,因此我对这个错误起源的矩阵发表了评论。 – 2010-12-17 15:10:37

3

这是一个设计限制。请记住xts或动物园基本上是一个矩阵加索引。不是数据框加索引。