【问题标题】:Modifying object for use with summary_table() in R: "Error: `x` must be a formula"修改对象以在 R 中与 summary_table() 一起使用:“错误:`x` 必须是公式”
【发布时间】:2020-08-18 06:05:21
【问题描述】:

我正在尝试使用here 概述的方法创建一个汇总统计表,尽管我愿意接受替代方案。

在本大纲中,他们建议创建要输入到 summary_table() 命令中的汇总统计列表,如下所示:

our_summary1 <-
  list("Miles Per Gallon" =
   list("min" = ~ min(.data$mpg),
        "max" = ~ max(.data$mpg),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$mpg)),
   "Displacement" =
   list("min" = ~ min(.data$disp),
        "median" = ~ median(.data$disp),
        "max" = ~ max(.data$disp),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$disp)),
   "Weight (1000 lbs)" =
   list("min" = ~ min(.data$wt),
        "max" = ~ max(.data$wt),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$wt)),
   "Forward Gears" =
   list("Three" = ~ qwraps2::n_perc0(.data$gear == 3),
        "Four"  = ~ qwraps2::n_perc0(.data$gear == 4),
        "Five"  = ~ qwraps2::n_perc0(.data$gear == 5))
   )

由于我的数据框中有 48 列(每个变量一个),我发帖询问是否有另一种方法可以创建上面列出的对象类型。基于the response,我创建了这样的摘要对象:

summarized <- df %>%
  pivot_longer(cols = c(1:48)) %>%
  group_by(name) %>%
  summarize(lst = list(list( 
                        mean = mean(value),
                        max = max(value), 
                        min = min(value), 
                        sd = sd(value))))
result <- deframe(summarized)

当我将它放入 summary_table() 函数时,该函数将不会运行。

table <- summary_table(df, summaries = result) 

我收到以下错误消息。

Error: `x` must be a formula

您知道为什么 summary_table() 函数似乎不适用于我正在使用的对象吗?我认为我创建的对象与布置为“our_summary1”的对象相当。我将不胜感激有关如何使其发挥作用的任何想法。

我查看了this questionthis question,它们都是关于相同的错误消息,但它们没有回答我的问题,因为它们以与我不同的方式创建要输入到 summary_table() 的对象.

【问题讨论】:

    标签: r datatable dplyr tidyverse summary


    【解决方案1】:

    这是一个创建表达式的选项,我们用map循环感兴趣的列名,通过插入名称创建一个字符串表达式,用sprintf,然后eval用@987654326解析后的表达式@。这将用于summary_table

    ---
    title: "new"
    author: "akrun"
    date: "5/3/2020"
    output: html_document
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```
    
    
    ```{r sumtable, results='asis'}
    library(qwraps2)
    library(dplyr)
    library(purrr)
    options(qwraps2_markup = "markdown")
    out <- map(c('mpg', 'disp', 'wt'), ~ 
         eval(rlang::parse_expr(sprintf('list("min" = ~ min(.data$%s),
           "max" = ~ max(.data$%s),
           "mean (sd)" = ~ qwraps2::mean_sd(.data$%s))', .x, .x, .x))))
    names(out) <- c("Miles Per Gallonv", "Displacement", "Weight (1000 lbs)" )
    summary_table(mtcars, out)
    ```
    

    -输出

    【讨论】:

    • 如果我将 map 的输入更改为 c(1:48),这是否适用于我的数据框中的 1:48 列?列名是默认名称吗?
    • @melbez 如果您使用的是数字索引,则必须使用 .x .x .x 进行更改,即 names(df)[.x], names(df)[.x], names(df)[.x] 或直接传递列名称而不进行任何更改,即 map(names(df)[1:48, ~
    • @melbez 在这里,我通过插入列名创建了一个带有sprintf 的字符串,然后在使用parse_expr 解析后对字符串进行了评估,summary_table 中使用了该字符串
    • 我得到的格式略有不同,但它仍然适用于我的目的。结构是一样的,但是字体不一样,我的背景都是白色的(不是白灰)。我不确定它是否只是因为我不知道的格式设置而有所不同。
    • @melbez 我认为我们需要results = 'asis'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多