Преобразовать двойной вектор в одиночный вектор, разделенный запятыми - PullRequest
1 голос
/ 22 марта 2020

У меня есть тиббл:

example <-  tibble(Level = list(0.80,0.90)) %>%

                mutate(bounds = list(c(2.3,4.5),
                                     c(2.7,5.2)))

Когда я создаю таблицу gt, я получаю тиббл 2х2, который выглядит примерно так:

Level  Bounds
0.80   2.3, 4.5
0.90   2.7, 5.1

Мне нужно 2х2 gt таблица, в которой под скобками находится только один элемент, в скобках:

Level  Bounds
0.80   (2.3,4.5)
0.90   (2.7,5.1)

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Один dplyr и purrr Возможны следующие варианты:

example %>%
 transmute(Level_bounds = paste(unlist(Level),
                                paste0("(", map_chr(bounds, paste, collapse = ","), ")"),
                                sep = " - "))

  Level_bounds   
  <chr>          
1 0.8 - (2.3,4.5)
2 0.9 - (2.7,5.2)

Если на самом деле нужны два столбца:

example %>%
 transmute(Level = unlist(Level),
           bounds = paste0("(", map_chr(bounds, paste, collapse = ","), ")"))

  Level bounds   
  <dbl> <chr>    
1   0.8 (2.3,4.5)
2   0.9 (2.7,5.2)
0 голосов
/ 22 марта 2020

Мы можем unnest столбцы list, сгруппированные по 'Level', paste 'элементы в' bounds 'и отформатировать их как sprintf

library(dplyr)
library(tidyr)
example %>%
    unnest %>% 
    group_by(new = Level) %>% 
    summarise(Level_Bounds = sprintf('%0.2f - (%s)',
             first(Level), toString(bounds))) %>%
    select(-new)
# A tibble: 2 x 1
#  Level_Bounds     
#  <chr>            
#1 0.80 - (2.3, 4.5)
#2 0.90 - (2.7, 5.2)

Если нам нужно два столбцы

library(stringr)
example %>%
 unnest %>% 
  group_by(Level) %>% 
  summarise(Bounds = str_c("(", toString(bounds), ")"))
# A tibble: 2 x 2
#   Level Bounds  
#   <dbl> <chr>   
# 1   0.8 (2.3, 4.5)
#2   0.9 (2.7, 5.2)

Или используя pmap

library(purrr)
example %>% 
    transmute(Level_bounds = pmap_chr(., ~  paste0(..1, " - (",
           toString(..2), ")")))
# A tibble: 2 x 1
#  Level_bounds    
#  <chr>           
#1 0.8 - (2.3, 4.5)
#2 0.9 - (2.7, 5.2)

Или используя base R

data.frame(Level = unlist(example$Level),
      Bounds = paste0("(", sapply(example$bounds, toString), ")"))
...