Referenciando a elementos dentro da lista para aplicar a função interativa definido dentro do map() - purrr

Oi Pessoal,

Estou com uma dúvida que parece ser simples.

Tenho uma lista cujos objetos têm elementos distinto, mas todos eles possuem um elemento Timestamp, com o mesmo nome = “Timestamp”.

Estou querendo converter via map todos os objetos desta lista em xts e para isso usar para cada objeto da lista o seu Timestamp para a ordenação. E é ai que estou com dúvida: como alimentar de forma iterativa a função as.xts com o elemento de “Timestamp” de cada objeto da lista.

tbl_A$Timestamp
[1]  "2020-09-26 12:14:03 UTC" "2020-09-26 12:14:51 UTC" "2020-09-26 12:25:48.........
tbl_B$Timestamp
[1] "2020-09-26 14:02:48 UTC" "2020-09-26 14:08:54 UTC" "2020-09-26 14:13:45 UTC" "2020-09-26 14:17:51 UTC" "2020-09-26 14:28:45 UTC"
tbl_C$Timestamp
[1] "2020-09-30 12:45:04 UTC" "2020-09-30 12:47:49 UTC" "2020-09-30 12:51:10 UTC" "2020-09-30 12:58:52 UTC" "2020-09-30 13:09:46 UTC"

 my_list <- list(tbl_A,tbl_B, tbl_C)

O que pensei:

my_list_xts <- map(my_list,~xts(.x),order.by=my_list[[.]]$Timestamp)
Error in xts(.x) : order.by requires an appropriate time-based object

map(my_list,~xts(.x),order.by=.x$Timestamp)
Error in xts(.x) : order.by requires an appropriate time-based object

map(my_list,~xts(.x),order.by="Timestamp")
Error in xts(.x) : order.by requires an appropriate time-based object

Conseguem me ajudar?

Obrigado,

Fábio

Opa, Fabio! Não testei, mas acho que seria assim:

map(my_list, xts, order.by="Timestamp")

equivalentemente,

map(my_list, ~xts(.x, order.by="Timestamp"))

Vale comparar as duas soluções! Quando se opta por usar o ~foo(.x) em vez do foo, os demais parâmetros tem que ser passados diretamente pra função.

Oi Athos!!

Obrigado pela resposta.

Desculpe, eu tb não ajudei colocando o código para teste, segue:

TimestampA <- seq(as.Date("2020-09-06"), length =5, by = "days")
TimestampB <- seq(as.Date("2020-01-06"), length =15, by = "days")
TimestampC <- seq(as.Date("2020-01-06"), length =10, by = "days")

dataA <- rnorm(5)
dataB <- rnorm(15)
dataC <- rnorm(10)

tbl_A <- data.frame(Timestamp = as.POSIXct(TimestampA),dataA)
tbl_B <- data.frame(Timestamp = as.POSIXct(TimestampB),dataB)
tbl_C <- data.frame(Timestamp = as.POSIXct(TimestampC),dataC)

my_list <- list(tbl_A,tbl_B,tbl_C)

Rodando os comandos sugeridos:

map(my_list,~xts(.x),order.by=.x$Timestamp)
map(my_list,~xts(.x),order.by="Timestamp")

Ainda estou obtendo erro:
Texto pré-formatadoError in xts(.x) : order.by requires an appropriate time-based object

Com o loop abaixo estou conseguindo:

for (i in 1:length(my_list)) {
my_list[[i]] <- as.xts(my_list[[i]],order.by=my_list[[i]]$Timestamp)
}

Alguma outra dica para conseguir com o map()?

Abraço,

Fábio

assim, consegui:

my_list <- map(my_list, ~.x %>% as.xts(order.by=.x$Timestamp))

1 curtida