2017-09-11 4 views
1

J'ai une liste de longueur 18, quand j'ai essayé de fusionner ces listes pour la création de trame de données, il change le format de la date en numérique.fusionner la liste change le format de la date en numérique

J'ai utilisé ci-dessous la syntaxe

forecast_data = do.call(rbind, datalist) 

il y a 3 colonne toutes les dates changé en numérique quand j'exécute le code ci-dessus.

Y at-il un moyen que je peux garder le type de colonne de date comme date seulement lors de la fusion de la liste. Veuillez nous conseiller

S'il vous plaît référer au-dessous de la liste d'échantillons et le résultat que je veux obtenir de jeu de la liste

datalist = list() 

l <- data.frame(ID=c(1), Date=as.Date("2017-07-02"), Prediction=c(66)) 
l <- as.list(l) 
datalist[[1]] <- (l) 

l <- data.frame(ID=c(1), Date=as.Date("2017-07-09"), Prediction=c(70)) 
l <- as.list(l) 
datalist[[2]] <- (l) 

l <- data.frame(ID=c(1), Date=as.Date("2017-07-16"), Prediction=c(77)) 
l <- as.list(l) 
datalist[[3]] <- (l) 


result <- data.frame(ID=c(1,1,1), Date=c("2017-07-02","2017-07-09","2017-07-16"), Prediction=c(66,70,77)) 
+2

Veuillez lire l'information sur [comment poser une bonne question] (http://stackoverflow.com/help/how-to-ask) et comment donner une [reproduc exemple concret] (http://stackoverflow.com/questions/5963269). Cela rendra beaucoup plus facile pour les autres de vous aider. – Jaap

+0

@ user3734568 J'ai modifié votre réponse pour que les dates de votre liste soient au format 'Date' – CPak

+1

Ceci se produit parce que' do.call (rbind, ...) 'contraint votre objet à la matrice. Puisque les matrices ne nécessitent aucun attribut, les classes telles que POSIXct ou les facteurs sont réduits à leurs valeurs numériques. – Sotos

Répondre

2

Vous pouvez utiliser rbindlist du package data.table

library(data.table) 
ans <- rbindlist(datalist) 

de sortie

ID  Date Prediction 
1: 1 2017-07-02   66 
2: 1 2017-07-09   70 
3: 1 2017-07-16   77 

str(ans) 

Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables: 
$ ID  : num 1 1 1 
$ Date  : Date, format: "2017-07-02" "2017-07-09" ... 
$ Prediction: num 66 70 77 

Données

datalist <- list(structure(list(ID = 1, Date = structure(17349, class = "Date"), 
Prediction = 66), .Names = c("ID", "Date", "Prediction")), 
structure(list(ID = 1, Date = structure(17356, class = "Date"), 
    Prediction = 70), .Names = c("ID", "Date", "Prediction" 
)), structure(list(ID = 1, Date = structure(17363, class = "Date"), 
    Prediction = 77), .Names = c("ID", "Date", "Prediction" 
))) 

J'ai modifié votre message afin que vos dates dans la liste sont le format Date

1

base en utilisant R, vous pouvez utiliser Reduce ou do.call

Reduce(rbind,Map(do.call,c(cbind.data.frame),datalist)) 
    ID  Date Prediction 
1 1 2017-07-02   66 
2 1 2017-07-09   70 
3 1 2017-07-16   77 

    do.call(rbind,Map(do.call,c(cbind.data.frame),datalist)) 
    ID  Date Prediction 
1 1 2017-07-02   66 
2 1 2017-07-09   70 
3 1 2017-07-16   77 

Les classes obtenues:

str(do.call(rbind,Map(do.call,c(cbind.data.frame),datalist))) 
'data.frame': 3 obs. of 3 variables: 
    $ ID  : num 1 1 1 
    $ Date  : Date, format: "2017-07-02" "2017-07-09" ... 
    $ Prediction: num 66 70 77