Создание таблицы результатов частотного анализа в R - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно создать таблицу определенного типа (шаблон)

Mydata 
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 шт.)

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

Я должен посчитать, сколько людей, разделенных на группы, имеют тот или иной побочный эффект. а сколько побочных эффектов в этой группе?

т.е. В первой группе у нас 9 человек, но есть два уникальных человека.

01-06-104
01-09-108

но общее количество средней степени тяжести равно 7. Таким образом, только два человека имеют побочный эффект легкой степени тяжести (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

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Я должен признать, что мне не ясно, что вы пытаетесь сделать. К сожалению, ваше ожидаемое выходное изображение не помогает.

I предположим, , что вы спрашиваете, как рассчитать двухстороннюю таблицу непредвиденных обстоятельств и показать как подсчеты, так и проценты (от общего числа). Вот 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%)
0 голосов
/ 05 июля 2018

с использованием базы 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%)
0 голосов
/ 05 июля 2018

вы хотите дроби вместе с общим количеством? Попробуйте:

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