2017-03-06 2 views
1

J'ai lu un fichier CSV en utilisant la commande read.csv() et je veux convertir en xts et graphique avec chartSeries().convertir yyyymm sur la classe de facteur à la classe de caractères à utiliser avec ChartSeries()

j'ai changé dans une matrice en faisant:

MyData <- as.matrix(MyData) 

Quand je convertir à XTS en utilisant

MyData_xts <- xts(MyData[,-1], order.by=as.POSIXct(MyData[,1])) 

je reçois le message d'erreur suivant:

Error in as.POSIXlt.character(as.character(x), ...) : 
    character string is not in a standard unambiguous format 

La colonne qui a mon index est au format yyyymm. J'ai lu que c'était peut-être un problème, mais je n'ai pas réussi à le contourner.

EDIT 1

Le CSV lu avant de se convertir à la matrice ressemble à ceci. Toutes les rangées sont des classes de facteurs:

X  |Mkt.RF|SMB 
------|------|--- 
196307|-0.39 |-.046 
196308|5.07 |-0.81 
196308|-1.57 |-.048 
+0

bethanyP, lors de la conversion en matrice la classe pour tous les champs convertit de facteur en caractère. – Yago

+0

G5W, lors de la conversion en xts NA sont créés dans la base de données. Je sais qu'ils ne sont pas là avant parce que j'utilise omit.na() pour éliminer toutes les lignes avec NA avant de convertir en xts. Mais après avoir converti en xts et en cours d'exécution chartSeries(), j'obtiens l'erreur suivante: Erreur dans na.omit.xts (x): type non pris en charge – Yago

+0

Veuillez fournir un exemple de votre fichier CSV. –

Répondre

0

Puisque vous ne fournissez aucune donnée, j'utiliserai un petit exemple de test qui correspond à votre description. Je ne pense pas que as.POSIXct fonctionnera sans jours spécifiques. Vous pouvez faire ce travail en utilisant le premier jour de chaque mois.

x = c("201701", "201702", "201703") 
xt = as.POSIXct(paste(x, "01", sep=""), format="%Y%m%d") 
xts(xt, order.by=xt) 
       [,1] 
2017-01-01 1483246800 
2017-02-01 1485925200 
2017-03-01 1488344400 

Mise à jour:
Je vois que vous avez maintenant fourni des données et dire que vous obtenez NAs. J'utilise les données que vous avez fournies, en les lisant en tant que csv, en les traitant avec mon code et en ne recevant pas les NA. Veuillez regarder à nouveau cette version du code.

Input = read.csv(text="X,Mkt.RF,SMB 
196307,-0.39 ,-.046 
196308,5.07 ,-0.81 
196308,-1.57 ,-.048", 
header=TRUE, stringsAsFactors=FALSE) 

library(xts) 
Input$xt = as.POSIXct(paste(Input$X, "01", sep=""), format="%Y%m%d") 
xts(Input, order.by=Input$xt) 
      X  Mkt.RF SMB  xt   
1963-07-01 "196307" "-0.39" "-0.046" "1963-07-01" 
1963-08-01 "196308" " 5.07" "-0.810" "1963-08-01" 
1963-08-01 "196308" "-1.57" "-0.048" "1963-08-01" 
+0

G5W merci pour votre réponse. J'ai passé en revue le code que vous avez soumis et obtenant toujours des NA après l'exécution de xts(). Je suis capable de générer l'index ok, mais lors de l'exécution de xts() et ensuite periodicity() j'obtiens le message d'erreur suivant: ne peut pas calculer la périodicité de 1 observation – Yago

3

Vous devez utiliser read.zoo pour importer votre CSV directement dans un objet zoo. Si vous le souhaitez, vous pouvez utiliser as.xts pour convertir l'objet zoo en xts. Vous devez également utiliser un index yearmon, car votre index n'a que des années et des mois.

Text <- "X,Mkt.RF,SMB 
196307,-0.39,-0.046 
196308, 5.07,-0.810 
196309,-1.57,-0.048" 

# function adapted from examples in ?read.zoo 
z <- read.zoo(text=Text, header=TRUE, sep=",", 
       FUN=function(x) as.yearmon(format(x), "%Y%m")) 
z 
#   Mkt.RF SMB 
# Jul 1963 -0.39 -0.046 
# Aug 1963 5.07 -0.810 
# Sep 1963 -1.57 -0.048 
+0

Je suis nouveau à R. Je ne comprends pas complètement le le code que vous avez fourni, en particulier pourquoi x/100 dans as.yearmon(). Je reçois le message d'erreur suivant: Erreur dans x/100: argument non numérique à l'opérateur binaire – Yago

+0

@Yago: cette partie n'est pas nécessaire, et je l'ai édité hors de ma réponse. Vous avez probablement eu cette erreur parce qu'il y a des lignes dans votre fichier CSV où la première colonne ne peut pas être interprétée comme numérique. Si c'est le cas, vous devez examiner attentivement les données du fichier CSV pour déterminer comment gérer ces lignes. –

+0

Joshua, tu avais raison.J'ai eu un problème de données dans une de mes lignes dans le fichier CSV d'origine. Le code fonctionne maintenant. Merci de votre aide – Yago