【问题标题】:Recreating Excel pivot tables in R - tabular or qpvt在 R 中重新创建 Excel 数据透视表 - 表格或 qpvt
【发布时间】:2020-10-26 20:20:26
【问题描述】:

这是一个患者数据的示例数据集(实际有大约 26k 行)。

library(pivottabler)
library(tables)
library(tidyverse)

df <- tribble(
  ~Patient, ~Physician, ~Specialty, ~Duration, ~CostWeight,
  1, "A", "Family Medicine", 5, 1.4215,
  2, "A", "Family Medicine", 7, 1.6463,
  3, "B", "Pediatrics", 1, 1.0214,
  4, "B", "Pediatrics", 3, 1.2345,
  5, "B", "Pediatrics", 6, 6.3243, 
  6, "C", "Neurology", 10, 2.5104,
  7, "D", "Dermatology", 0, 1.0424,
  8, "E", "Family Medicine", 2, 1.5234
)

Picture of data.

基本上,我正在尝试在 R 中重新创建 Excel 数据透视表,因为这将每月使用不同的数据集进行,最好插入文件并运行代码来获取数据透视表,而不是比手工做。

我想要一个看起来像 this 的表格。

期望的特性:

  • 需要每个专业分组的总行数
  • 需要总计行
  • 可以使用kable()/kableExtra 包自定义的表

尝试 1

我尝试过使用this example

tabular(Specialty * (Physician + 1) + 1 ~
          (
            (Count = Patient) +
            (avgDuration = mean(Duration)) +
            (avgCostWeight = mean(CostWeight))
          ), 
        data = df)

但是,我一直收到错误提示

term2table(rows[[i]], cols[[j]], data, n) 中的错误:重复值:专业和医师”。

尝试 2

我也尝试过使用 this post 的 pivottabler 包。

pt <- df %>%
  qpvt(c("Specialty", "Physician"), NULL, c("Discharges" = "n()", 
                                            "avgDuration" = "mean(Duration)", 
                                            "avgCostWeight" = "mean(CostWeight)")
       )

pt$evaluatePivot()
df <- pt$asDataFrame()

df %>%
  kbl()

但是,输出不太理想,因为它将 Specialty 和 Physician 列连接到 one

有人有线索吗?

【问题讨论】:

    标签: r r-markdown pivot-table tabular


    【解决方案1】:

    您应该查看库DT 以获取长期使用的工具,只需使用几行代码即可构建您正在寻找的最小示例,您可能需要先安装它。

    library(DT)
    library(tidyverse)
    
    df <- tribble(
      ~Patient, ~Physician, ~Specialty, ~Duration, ~CostWeight,
      1, "A", "Family Medicine", 5, 1.4215,
      2, "A", "Family Medicine", 7, 1.6463,
      3, "B", "Pediatrics", 1, 1.0214,
      4, "B", "Pediatrics", 3, 1.2345,
      5, "B", "Pediatrics", 6, 6.3243, 
      6, "C", "Neurology", 10, 2.5104,
      7, "D", "Dermatology", 0, 1.0424,
      8, "E", "Family Medicine", 2, 1.5234
    )
    
    #getting count
    df %>% 
      group_by(Specialty) %>% 
      count()
    
    #creating table
    datatable(df_grouped, filter = 'top', options = list(
      pageLength = 5, autoWidth = TRUE
    ))
    

    计数过滤器获取数据透视表中的计数,然后 DT 表是动态的并且可以过滤

    【讨论】:

    • 但是如何获得组总行和总行?我想要一个用于分组的总计数、平均持续时间和平均成本权重的列,以及数据透视表屏幕截图中显示的总计。
    • 数据透视表有很多重复的行。我认为您可以为group_by() 制作一张表格,其中包含医生的总数,然后是另一张患者表格。
    • 或者你制作一个long数据集
    • 我的意思是,样本数据集的数据透视表有重复的行,但我的实际数据集有 >26,000 个观察值,所以它的数据透视表不会有重复的行。我想我会在 Excel 中手动完成这些操作。
    • 您如何计算平均持续时间,number_of_patients/durations?我了解您想要数据透视表,但我不确定数据透视表的显示方式是否实际上是一种将数据制成表格的好方法,如果该列在同一列中有医师和专业,您如何正确分析那?这就是为什么我建议两张桌子,我更新了我的答案以获得每个group_by()
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多