Arnaud,

Short answer may be that the tibble data structure will not be supporting row 
names and you may want to simply save those names in an additional column or 
externally.

My first thought was to simply save the names you need and then put them back 
on the tibble. In your code, something like this:

save.names <- names(my.ret.lst)
result.tib <- as_tibble_col(unlist(my.ret.lst), column_name = 'return')
rownames(result.tib) <- save.names

Unfortunately, I got an error message:

> save.names
[1] "BTCUSDT" "ETHUSDT" "TRXUSDT"
> rownames(result.tib) <- save.names
Warning message:
Setting row names on a tibble is deprecated. 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in assign(cacheKey, frame, .rs.CachedDataEnv) : 
  attempt to use zero-length variable name

If a tibble deprecates row names, it may not be the ideal storage for you. A 
plain data.frame works:

> result.df <- as.data.frame(result.tib)
> rownames(result.df) <- save.names
> result.df
        return
BTCUSDT  15.36
ETHUSDT   4.06
TRXUSDT  10.90

Trying to convert it to a tibble, as anticipated, is not working for me:

> as.tibble(result.df)
# A tibble: 3 × 1
  return
   <dbl>
1  15.4 
2   4.06
3  10.9 
Warning message:
`as.tibble()` was deprecated in tibble 2.0.0.
ℹ Please use `as_tibble()` instead.
ℹ The signature and semantics have changed, see `?as_tibble`.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this
warning was generated.

You can, instead, create a matrix and assign the row and column names you save 
or create:

result.mat <- matrix(my.ret.lst)
colnames(result.mat) <- c("return")
rownames(result.mat) <- save.names

> result.mat
        return
BTCUSDT 15.36 
ETHUSDT 4.06  
TRXUSDT 10.9

But saving a matrix to reuse has other considerations.

So, if I may make a suggestion, if you really want a tibble that allows you to 
know what each row is for, consider one of many methods for saving the previous 
row names as a new column. I used that to take the data.frame version I made 
above and got:

> temp <- as_tibble(result.df, rownames="rows")
> temp
# A tibble: 3 × 2
  rows    return
  <chr>    <dbl>
1 BTCUSDT  15.4 
2 ETHUSDT   4.06
3 TRXUSDT  10.9

Note the above uses as_tibble with an underscore, but many other ways to make a 
column exist.


-----Original Message-----
From: R-help <r-help-boun...@r-project.org> On Behalf Of arnaud gaboury
Sent: Tuesday, October 17, 2023 4:30 AM
To: r-help <r-help@r-project.org>
Subject: [R] transform a list of arrays to tibble

I work with a list of crypto assets daily closing prices in a xts
class. Here is a limited example:

asset.xts.lst <- list(BTCUSDT = structure(c(26759.63, 26862, 26852.48, 27154.15,
27973.45), dim = c(5L, 1L), index = structure(c(1697068800, 1697155200,
1697241600, 1697328000, 1697414400), tzone = "UTC", tclass = "Date"),
class = c("xts",
"zoo")), ETHUSDT = structure(c(1539.61, 1552.16, 1554.94, 1557.77,
1579.73), dim = c(5L, 1L), index = structure(c(1697068800, 1697155200,
1697241600, 1697328000, 1697414400), tzone = "UTC", tclass = "Date"),
class = c("xts",
"zoo")), TRXUSDT = structure(c(0.08481, 0.08549, 0.08501, 0.08667,
0.08821), dim = c(5L, 1L), index = structure(c(1697068800, 1697155200,
1697241600, 1697328000, 1697414400), tzone = "UTC", tclass = "Date"),
class = c("xts",
"zoo")))

I will compute some function from PerformanceAnalytics package and
write all results in a tibble. Let's apply a first function,
Return.annualized() (at first I computed returns from daily prices). I
have now a list of arrays named my.ret.lst:

my.ret.lst <- list(BTCUSDT = structure(15.36, dim = c(1L, 1L), dimnames = list(
    "Annualized Return", NULL)), ETHUSDT = structure(4.06, dim = c(1L,
1L), dimnames = list("Annualized Return", NULL)), TRXUSDT =
structure(10.9, dim = c(1L,
1L), dimnames = list("Annualized Return", NULL)))

Now I can't find how to build a  tibble in a specific format (asset
names as row names and observations as column names) .
I can of course run:
> mytb <- as_tibble(unlist(my.ret.lst)
but I loose row and column names.
> as_tibble_col(unlist(my.ret.lst), column_name = 'return')
will give me the wanted column name but row names (in my case asset
names) are missing.


Thank you for help

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to