【问题标题】:Creating a table for frequency analysis results in R在 R 中创建频率分析结果表
【发布时间】:2018-12-13 16:46:42
【问题描述】:

我需要根据某个模板创建一个特定类型的表格。

这是我的数据:

df = structure(list(group = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L),
                    degree = structure(c(1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 1L, 1L),
                                       .Label = c("Mild severity", "Moderate severity", "Severe severity"),
                                       class = "factor")), 
               .Names = c("group", "degree"), 
               class = "data.frame", 
               row.names = c(NA, -10L))

我进行了交叉表:

table(df$degree,df$group)
                   
                    1 2 3
  Mild severity     3 3 2
  Moderate severity 0 0 1
  Severe severity   0 0 1

但我需要在此模板中格式化结果: [![在此处输入图片描述][1]][1]

如何创建具有这种结构的表?

非常重要的编辑

完整的 dput() (42 obs.)

df = structure(list(Study.Subject.ID = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 5L, 7L, 8L, 9L, 1L, 2L, 3L, 5L, 8L, 2L, 3L, 5L, 8L, 2L, 3L, 5L, 8L, 2L, 3L, 5L, 8L, 3L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L),
                                                 .Label = c("01-06-104", "01-09-108", "01-15-201", "01-16-202", "01-18-204", "01-27-301", "01-28-302", "01-33-305", "01-42-310"),
                                                 class = "factor"),
                    group = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 3L, 1L, 2L, 2L, 3L, 1L, 2L, 2L, 3L, 1L, 2L, 2L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L),
                    Degree.of.severity = structure(c(2L, 2L, 2L, 2L, 2L, 4L, 3L, 2L, 2L, 2L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 2L, 3L, 3L, 3L, 3L),
                                                   .Label = c("Life-threatening or disabling", "Mild severity", "Moderate severity", "Severe severity"),
                                                   class = "factor")),
              .Names = c("Study.Subject.ID", "group", "Degree.of.severity"),
              class = "data.frame",
              row.names = c(NA, -42L))

主题有概念,概念有很多副作用。 一个人可能有多种副作用。 副作用可能是

severity
Moderate
Severe

我必须计算按组分开有多少人有这种或那种副作用, 该组有多少副作用?

I.E.在第一组中,我们有 9 个观察结果,但有两个独特的人。

01-06-104
01-09-108

Mild severity 的总数为 7。 所以只有两个人有Mild severity (X) 的副作用,Mild severity 的总数是 7 (Y)。 患者总数为 42,因此要计算百分比,我们必须除以 42 (2/42)=4,7

这就是为什么我期望输出是:

    degree       group1           group2         group3 
                  X (%)Y          X (%)Y         X (%) Y
                        
    Mild severity   2 (4,7%)7   3 (7,1%)13   3(7,1%)    12
    Moderato        1 (2,3%)1   0(0,0%%)0    2(4,7%)    6
    Severe severity 0(0,0%%)0   0(0,0%%)0     1(2,3)    1

【问题讨论】:

  • 我不知道你在追求什么。您是否在问如何生成频率(而不是计数)表?或者如何用计数和频率来布置表格?或者如何将表格的输出存储在 Excel 中?我不明白 XY 应该表示哪些列。你能根据样本数据(不是图像,而是真实数据)添加你的预期输出吗?
  • @MauritsEvers 我编辑了帖子,请检查一下,你的答案是对的,但需要补充。
  • 编辑的 dput 不足以给你想要的结果
  • @Onyambu 和 MauritsEvers 我用更多的 obs 更新了 dput。
  • 编辑的dput 仍然没有帮助。所有Study.Subject.IDs都不一样,所以我不明白你的意思“所以不是三个男人,是一个人有3个副作用”。您需要退后一步,提出一个具有代表性且最小的样本数据集,并根据样本数据清晰地呈现您的预期输出。您的预期输出应包含带有实际数字的完整表格,而不仅仅是(部分)屏幕截图。只有这样才能提供帮助。

标签: r dplyr crosstab tabular


【解决方案1】:

我不得不承认,我不清楚你想要做什么。不幸的是,您预期的输出图像没有帮助。

假设您在问如何计算 2 路列联表并显示计数和百分比(总数)。这是tidyverse 的可能性

library(tidyverse)
df %>%
    group_by(group, degree) %>%
    summarise(n = n(), perc = n() / nrow(.)) %>%
    mutate(entry = sprintf("%i (%3.2f%%)", n, perc * 100)) %>%
    select(-n, -perc) %>%
    spread(group, entry, fill = "0 (0.0%%)")
## A tibble: 3 x 4
#  degree            `1`        `2`        `3`
#  <fct>             <chr>      <chr>      <chr>
#1 Mild severity     3 (30.00%) 3 (30.00%) 2 (20.00%)
#2 Moderate severity 0 (0.0%%)  0 (0.0%%)  1 (10.00%)
#3 Severe severity   0 (0.0%%)  0 (0.0%%)  1 (10.00%)

【讨论】:

  • 是的,很好,你明白我想要什么,但你能添加新列吗?我编辑了帖子,请检查编辑
【解决方案2】:

您想要分数和总数吗?试试:

n=table(df$degree,df$group)
df=as.data.frame(cbind(n/colSums(n)*100,n))

【讨论】:

  • 这个有点不对,需要按照表格模板填写。请提供您的输出。它与表格不同
【解决方案3】:

使用基础 R:

a = transform(data.frame(table(df)),Freq = sprintf("%d (%3.2f%%)",Freq,prop.table(Freq)*100))
data.frame(t(unstack(a,Freq~degree)))
                          X1         X2         X3
Mild.severity     3 (30.00%) 3 (30.00%) 2 (20.00%)
Moderate.severity  0 (0.00%)  0 (0.00%) 1 (10.00%)
Severe.severity    0 (0.00%)  0 (0.00%) 1 (10.00%)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多