Home > Software engineering >  Descend cols with rownames within nests
Descend cols with rownames within nests

Time:10-14

I have a nest of tables whereby I want to convert the rowname into the row cells that its in and order each column accordingly by the rank before its replaced by the rowname.

For example:

mtX <- apply(mtcars, 2, as.numeric) %>% data.frame(.)
rownames(mtX) <- rownames(mtcars)

mtNest <- mtX %>% nest_by(vs) %>%
  ungroup %>%
  mutate(data = map(data, ~ .x %>%
                      nest(data = -am) %>%
                      mutate(data = map(
                        data, ~ .x %>%
                          nest(data = -gear) %>% mutate(data = map(
                            data, ~ .x %>%  mutate(across(., function(x)
                              min_rank(-x))) %>% rownames(data)[order(-.x)]
                          ))
                      ))))

This is similar to my previous post: Descend each column and update with row names

However, I keep getting the following error:

Error in mutate(): ! Problem while computing data = map(...). Caused by error in mutate(): ! Problem while computing data = map(...). Caused by error in mutate(): ! Problem while computing data = map(...). Caused by error in mutate(): ! Problem while computing ..1 = across(., function(x) min_rank(-x)). Caused by error in across(): ! Must subset columns with a valid subscript vector. ✖ Subscript has the wrong type `tbl_df< mpg : double cyl : double disp: double hp : double drat: double wt : double qsec: double carb: double

CodePudding user response:

With tibble/data.table, it wouldn't allow row.names other than the index. Thus, when we apply modifications on the dataset, it automatically replaces the row names with index when a function returns a tibble (here nest returns a tibble). Therefore, it is better to create a row names column (rownames_to_column from tibble) before doing the nesting. Based on the code, we are recursively creating nested data. In the innermost nested 'data', we loop over the columns that are numeric, get the rank and replace with the 'rn' column

library(dplyr)
library(purrr)
library(tibble)
out <- mtX %>% 
  rownames_to_column("rn") %>%
  nest_by(vs) %>%
  ungroup %>%
  mutate(data = map(data, ~ .x %>%
                      nest(data = -am) %>%
                      mutate(data = map(
                        data, ~ .x %>%
                          nest(data = -gear) %>% 
   mutate(data = map(
                            data, ~ .x %>% 
       mutate(across(where(is.numeric), function(x) rn[min_rank(-x)]))   ))))))

-output

> out
# A tibble: 2 × 2
     vs data            
  <dbl> <list>          
1     0 <tibble [2 × 2]>
2     1 <tibble [2 × 2]>

> out$data[[1]]$data[[1]]$data
[[1]]
# A tibble: 2 × 9
  rn            mpg       cyl       disp      hp        drat      wt            qsec          carb     
  <chr>         <chr>     <chr>     <chr>     <chr>     <chr>     <chr>         <chr>         <chr>    
1 Mazda RX4     Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4 Wag Mazda RX4 Wag Mazda RX4
2 Mazda RX4 Wag Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4 Mazda RX4     Mazda RX4     Mazda RX4

[[2]]
# A tibble: 4 × 9
  rn             mpg            cyl           disp           hp             drat           wt             qsec           carb          
  <chr>          <chr>          <chr>         <chr>          <chr>          <chr>          <chr>          <chr>          <chr>         
1 Porsche 914-2  Porsche 914-2  Maserati Bora Maserati Bora  Maserati Bora  Porsche 914-2  Maserati Bora  Porsche 914-2  Maserati Bora 
2 Ford Pantera L Ferrari Dino   Porsche 914-2 Porsche 914-2  Ford Pantera L Ford Pantera L Ford Pantera L Maserati Bora  Ferrari Dino  
3 Ferrari Dino   Ford Pantera L Ferrari Dino  Ferrari Dino   Ferrari Dino   Ferrari Dino   Ferrari Dino   Ford Pantera L Ford Pantera L
4 Maserati Bora  Maserati Bora  Porsche 914-2 Ford Pantera L Porsche 914-2  Maserati Bora  Porsche 914-2  Ferrari Dino   Porsche 914-2 
  •  Tags:  
  • r
  • Related