работа со столбцами, содержащими объекты класса `call` в` tidyr :: unnest` - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть пакет, который создает вызовы, содержащие статистические данные, которые затем могут отображаться в графиках.

Вот простой пример использования:

# setup
set.seed(123)
library(statsExpressions)
library(tidyverse)

# two-sample t-test results in an expression
stats_exp <- bf_ttest(mtcars, am, wt)

# class of object
class(stats_exp)
#> [1] "call"

# using the expression to display details in a plot
ggplot(mtcars, aes(as.factor(am), wt)) + geom_boxplot() +
  labs(subtitle = stats_exp)

Теперь предположим, что я хотел сделать один и тот же вид визуализаций для всех уровней группирующей переменной. В этом случае мне нужно будет создать и сохранить вызов для каждого уровня.

Я могу успешно сделать это, используя tidyr, который может сохранить объекты call в столбце списка:

# doing this across groups
(df <- mtcars %>%
  group_nest(cyl) %>%
  mutate(stats_exp = data %>% map(., ~bf_ttest(., am, wt))))

# A tibble: 3 x 3
    cyl data               stats_exp 
  <dbl> <list>             <list>    
1     4 <tibble [11 × 10]> <language>
2     6 <tibble [7 × 10]>  <language>
3     8 <tibble [14 × 10]> <language> 

# did it work? yes!
df$stats_exp[[1]]
#> atop(displaystyle(NULL), expr = paste("In favor of null: ", "log"["e"], 
#>     "(BF"["01"], ") = ", "-1.58", ", ", italic("r")["Cauchy"]^"JZS", 
#>     " = ", "0.71"))

Проблема возникает, когда я пытаюсь удалить ее, что я хотел бы сделать, так как мне нужно будет выполнить некоторые другие операции с этим фреймом данных где-то вниз по течению в моем рабочем процессе:

# unnest
tidyr::unnest(data = df, cols = c(stats_exp, data)) 
#> Error: Input must be list of vectors

Как можно Я избегаю этой ошибки?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Основано на решении, предоставленном в Twitter (h / t @ dvaughan32). unnest не завершится с ошибкой, если stats_exp не включен в аргумент cols:

library(tidyverse)
library(statsExpressions)

# doing this across groups
df <- mtcars %>%
  group_nest(cyl) %>%
  mutate(stats_exp = data %>% map(., ~bf_ttest(., am, wt)))

# alternative  
tidyr::unnest(data = df, cols = c(data)) 

#> # A tibble: 32 x 12
#>      cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb stats_exp 
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <list>    
#>  1     4  22.8 108      93  3.85  2.32  18.6     1     1     4     1 <language>
#>  2     4  24.4 147.     62  3.69  3.19  20       1     0     4     2 <language>
#>  3     4  22.8 141.     95  3.92  3.15  22.9     1     0     4     2 <language>
#>  4     4  32.4  78.7    66  4.08  2.2   19.5     1     1     4     1 <language>
#>  5     4  30.4  75.7    52  4.93  1.62  18.5     1     1     4     2 <language>
#>  6     4  33.9  71.1    65  4.22  1.84  19.9     1     1     4     1 <language>
#>  7     4  21.5 120.     97  3.7   2.46  20.0     1     0     3     1 <language>
#>  8     4  27.3  79      66  4.08  1.94  18.9     1     1     4     1 <language>
#>  9     4  26   120.     91  4.43  2.14  16.7     0     1     5     2 <language>
#> 10     4  30.4  95.1   113  3.77  1.51  16.9     1     1     5     2 <language>
#> # … with 22 more rows

Создан в 2020-02-27 пакетом Представить ( v0.3.0)

0 голосов
/ 25 февраля 2020

Я не уверен, что вы собираетесь делать с stats_exp после того, как вы манипулировали другими данными, но это может стать потенциальным решением:

set.seed(123)
library(statsExpressions)
library(tidyverse)

stats_exp <- bf_ttest(mtcars, am, wt)

df <- mtcars %>%
  group_nest(cyl) %>%
  mutate(stats_exp = map(data, ~ bf_ttest(.x, am, wt)),
         stats_chr = map(stats_exp, ~ paste0(deparse(.x), collapse = " ")))

df %>% 
  select(stats_chr) %>% 
  unnest(cols = stats_chr)
#> # A tibble: 3 x 1
#>   stats_chr                                                                     
#>   <chr>                                                                         
#> 1 "atop(displaystyle(NULL), expr = paste(\"In favor of null: \", \"log\"[\"e\"]~
#> 2 "atop(displaystyle(NULL), expr = paste(\"In favor of null: \", \"log\"[\"e\"]~
#> 3 "atop(displaystyle(NULL), expr = paste(\"In favor of null: \", \"log\"[\"e\"]~

Создано в 2020-02 -25 при представлении пакета (v0.3.0)

...