2010-12-17 13 views
4

Wenn Sie einen Datenrahmen mit gemischten Faktor- und numerischen Spalten in ein xts konvertieren, werden alle meine Daten in Zeichenfolgen konvertiert. Dies ist kein Problem mit den Faktoren, aber es ist extrem ärgerlich mit den Zahlen. Gibt es eine Problemumgehung?R: Konvertieren von Datenrahmen (gemischter Faktor und numerisch) nach XTS in R

Zum Beispiel:

> 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" 

Idealerweise möchte ich die erste Spalte numerisch bleiben, während die zweite in einen String umgewandelt wird. Die Lösung muss vollständig automatisiert werden, da ich mit Datensätzen mit einer großen Anzahl von Spalten arbeite, und ich kann nicht immer vorhersagen, welche Faktoren und welche numerisch sein werden.

-

Edit:

Ich habe versucht, durch Definieren Sie die folgende Funktion, um dieses Problem zu erhalten:

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) 

} 

aber wenn die beiden XTS Objekte verschmelzen, die String-Daten ist konvertiert in NA:

> 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 

Ist dies ein bekanntes Problem mit dem XTS-Paket, oder mache ich etwas falsch?

Antwort

6

Sie können dies nicht tun, da xts eine numerische Matrix benötigt.

+0

Ah, danke. Ich muss einen Workaround finden. –

+2

Um etwas spezifischer zu sein: Zoo/Xts sind eine Matrix plus ein Indexattribut, und Sie können Typen in einer Matrix nicht mischen. –

+0

Ja, aber dieser OP-Fehler war nicht einmal im Indextyp, sondern die zugrunde liegende Payload, daher mein Kommentar zu der Matrix, woher dieser Fehler stammt. –

3

Es ist eine Beschränkung von Design. Denken Sie daran, dass XTS oder Zoo im Grunde eine Matrix plus Index ist. kein Datenrahmen plus Index.