J'essaie d'ajouter une liste de dates à une liste de listes telles que myList ci-dessous. Cela fonctionne comme prévu, sauf que le format de date pour l'élément de date dans chaque élément de liste est perdu. Des idées?

myList<-list(list("event"="A"),
             list("event"="B"),
             list("event"="C"))

dates<-as.Date(c("2011-06-05","2012-01-12","2016-05-09"))

outList<-mapply(FUN="c",myList,eventDate=as.list(dates),SIMPLIFY = FALSE)

Je cherche à réaliser ce qui suit

[[1]]
  [[1]]$event
  [1] "A"

  [[1]]$eventDate
  [1] "2011-06-05"


[[2]]
  [[2]]$event
  [1] "B"

  [[2]]$eventDate
  [1] "2012-01-12"


[[3]]
  [[3]]$event
  [1] "C"

  [[3]]$eventDate
  [1] "2016-06-09"
1
Morgan Ball 28 nov. 2017 à 15:44

3 réponses

Meilleure réponse

En utilisant Map, vous pouvez également créer une petite fonction (lambda) comme ceci:

myList <- list(
  list(event = "A"),
  list(event = "B"),
  list(event = "C")
)

dates <- as.Date(c("2011-06-05", "2012-01-12", "2016-05-09"))

outList <- Map(f = function(origList, date) {
  origList$eventDate <- date
  return(origList)
}, myList, dates)

outList
#> [[1]]
#> [[1]]$event
#> [1] "A"
#> 
#> [[1]]$eventDate
#> [1] "2011-06-05"
#> 
#> 
#> [[2]]
#> [[2]]$event
#> [1] "B"
#> 
#> [[2]]$eventDate
#> [1] "2012-01-12"
#> 
#> 
#> [[3]]
#> [[3]]$event
#> [1] "C"
#> 
#> [[3]]$eventDate
#> [1] "2016-05-09"

La raison pour laquelle vous obtenez les dates converties en nombres est que la fonction c convertit tous les éléments vers le type commun le plus bas (généralement des caractères, dans ce cas numériques).

Par exemple:

c(123, as.Date("2016-01-01"))
#> [1]   123 16801
4
Morgan Ball 28 nov. 2017 à 14:30

Un wrapper de liste supplémentaire pour isoler chaque élément Date fonctionnera également ici. J'ai construit cela en exécutant un lapply avec la fonction list sur le vecteur de dates:

Map("c", myList, eventDate=lapply(dates, list))
[[1]]
[[1]]$event
[1] "A"

[[1]]$eventDate
[1] "2011-06-05"


[[2]]
[[2]]$event
[1] "B"

[[2]]$eventDate
[1] "2012-01-12"


[[3]]
[[3]]$event
[1] "C"

[[3]]$eventDate
[1] "2016-05-09"
2
lmo 28 nov. 2017 à 13:59

Il peut être préférable d'indexer car c pourrait le contraindre à une valeur de stockage entière

for(i in seq_along(myList)) myList[[i]][['eventDate']] <- dates[i]
4
akrun 28 nov. 2017 à 12:49
47531957