【问题标题】:working with columns containing `call` class objects in `tidyr::unnest`在 `tidyr::unnest` 中处理包含 `call` 类对象的列
【发布时间】:2020-02-25 13:16:45
【问题描述】:

我有一个包,它创建包含统计详细信息的调用,然后可以在图中显示。

这是一个简单的用例:

# 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

我怎样才能避免这个错误?

【问题讨论】:

    标签: r tidyverse tidyr


    【解决方案1】:

    我不确定您在处理完其他数据后打算对 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\"]~
    

    reprex package (v0.3.0) 于 2020 年 2 月 25 日创建

    【讨论】:

    • 不幸的是,这并没有解决我的问题,它只是避免了它。
    【解决方案2】:

    基于 Twitter (h/t @dvaughan32) 上提供的解决方案。如果stats_exp 不包含在cols 参数中,unnest 不会失败:

    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
    

    reprex package (v0.3.0) 于 2020 年 2 月 27 日创建

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      相关资源
      最近更新 更多