Как я могу генерировать таблицы просто и быстро в R? - PullRequest
0 голосов
/ 01 ноября 2019

Я не спрашиваю о командах str () или glimpse (), а о лучшем способе генерации таблиц.

Допустим, я хочу посмотреть, влияет ли моя фоновая переменная (gymnasiegrov) на мою переменную результата (totstatus_bin).

Затем я пишу

vettig_tabell<-table(fulldata$gymnasiegrov,fulldata$totstatus_bin)

Затем мне нужно преобразовать этот кадр данных, чтобы его было легко прочитать в Rstudio:

vettig_tabell<-as.data.frame(vettig_tabell)

Затемчтобы распределить значения, чтобы я мог видеть разные результаты в одной строке для каждой категории:

vettig_tabell<-spread(vettig_tabell, Var2, Freq)

Если я хочу рассчитать относительные частоты, я должен рассчитать их следующим образом:

vettig_tabell<-vettig_tabell%>%mutate(ongoing=`pågående studier`/(`pågående studier´ + ´avbrott eller återbud´))

Это кажется ненужным количеством усилий для создания простой таблицы. Есть ли способ сделать это проще и быстрее?

Выдержка из данных:

structure(list(gymnasiegrov = c("Hotell- och Restaurang", NA, 
"specialutformat program", "komvux", NA, "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"estetiska programmet", "komvux", "naturvetenskapliga programmet", 
NA, "specialutformat program", "estetiska programmet", "medieprogrammet/medieproduktion", 
"specialutformat program", "specialutformat program", "komvux", 
"estetiska programmet", "samhällsvetenskapliga programmet", "specialutformat program", 
"friskoleprogram", "teknikprogrammet", "specialutformat program", 
"teknikprogrammet", "Handels- och administrationsprogrammet", 
"Hotell- och Restaurang", "samhällsvetenskapliga programmet", 
"samhälls- och ekonomiprogrammet", "specialutformat program", 
"komvux", "specialutformat program", "specialutformat program", 
"bygg, el, fordon, hantverk, sjöfart, industriteknik", "komvux", 
"Handels- och administrationsprogrammet", "teknikprogrammet", 
"teknikprogrammet", "friskoleprogram", "specialutformat program", 
"naturvetenskapliga programmet", "naturvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "samhällsvetenskapliga programmet", 
"Hotell- och Restaurang", "specialutformat program", "samhällsvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "komvux", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"estetiska programmet", "estetiska programmet", "samhällsvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"naturvetenskapliga programmet", "Handels- och administrationsprogrammet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"bygg, el, fordon, hantverk, sjöfart, industriteknik", "ekonomiprogrammet/ juridik", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "Handels- och administrationsprogrammet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "estetiska programmet", 
"ekonomiprogrammet/ ekonomi", "teknikprogrammet", "samhällsvetenskapliga programmet", 
"naturvetenskapliga programmet", "naturvetenskapliga programmet", 
"teknikprogrammet", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "samhällsvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "samhällsvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ juridik", 
"teknikprogrammet", "teknikprogrammet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"naturvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"teknikprogrammet", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ juridik", "naturvetenskapliga programmet", 
"teknikprogrammet", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "estetiska programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "teknikprogrammet", 
"naturvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
NA, NA, NA, NA, NA, NA, NA, NA), totstatus_bin = c("troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "troligt avbrott eller återbud", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "troligt avbrott eller återbud", "pågående studier", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "troligt avbrott eller återbud", "pågående studier", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"troligt avbrott eller återbud", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier")), row.names = c(NA, -162L), class = "data.frame")

Ответы [ 4 ]

3 голосов
/ 01 ноября 2019

Вы можете сделать следующее (при условии, что я вас правильно понял), используя data.table:

Код

require(data.table); dt = setDT(fulldata)

dt[, Pågående := fifelse(totstatus_bin == 'pågående studier', 1, 0)]
freq_table = dt[, .(Frekvens_Pågående = mean(Pågående)), keyby = gymnasiegrov]

В качестве альтернативы вы можете обойти манекенэтап, обозначенный @jangorecki:

require(data.table); dt = setDT(fulldata)
dt[, .(Frekvens_Pågående = mean(totstatus_bin == 'pågående studier')), keyby = gymnasiegrov]

Результат

> freq_table
                                           gymnasiegrov Frekvens_Pågående
 1:                                                <NA>         0.7272727
 2:              Handels- och administrationsprogrammet         0.7500000
 3:                              Hotell- och Restaurang         0.3333333
 4: bygg, el, fordon, hantverk, sjöfart, industriteknik         0.7000000
 5:                          ekonomiprogrammet/ ekonomi         0.6181818
 6:                          ekonomiprogrammet/ juridik         0.7000000
 7:                                estetiska programmet         0.7142857
 8:                                     friskoleprogram         1.0000000
 9:                                              komvux         0.3333333
10:                     medieprogrammet/medieproduktion         0.0000000
11:                       naturvetenskapliga programmet         0.6428571
12:                     samhälls- och ekonomiprogrammet         1.0000000
13:                    samhällsvetenskapliga programmet         0.6875000
14:                             specialutformat program         0.5454545
15:                                    teknikprogrammet         0.4545455
2 голосов
/ 01 ноября 2019

Это создаст фрейм данных, который выглядит как таблица, без преобразования в длинную форму и обратно. Пакеты не используются.

as.data.frame.matrix(table(fulldata))

Аналогично, чтобы получить средние значения:

as.data.frame.matrix(prop.table(table(fulldata), 1))

Это даст окончательный кадр данных, показанный в вопросе:

tab <- table(fulldata)
transform(as.data.frame.matrix(tab), ongoing = prop.table(tab, 1)[, 1])

Таблица частот

Для таблицы частот также могут использоваться следующие пакеты:

1) janitor :: tabyl

Для таблицы частот:функция tabyl в пакете janitor может создавать таблицы класса c("tabyl", "data.frame")

library(janitor)
tabyl(fulldata, gymnasiegrov, totstatus_bin)

2) data.table :: dcast

Для таблицы частот, это создает data.frame. Пакет reshape2 также имеет dcast, который используется с теми же аргументами.

library(data.table)
dcast(fulldata, gymnasiegrov ~ totstatus_bin)
2 голосов
/ 01 ноября 2019

Вот вариант на основе тидиверса. Он также правильно обрабатывает пропущенные значения в gymnasiegrov, а не просто отбрасывает их:

library(tidyverse)

fulldata %>% 
    group_by_all() %>% 
    count %>% 
    spread(totstatus_bin, n, fill = 0) %>% 
    mutate(ongoing = `pågående studier`/(`pågående studier` + `troligt avbrott eller återbud`))

Вывод:

# A tibble: 15 x 4
# Groups:   gymnasiegrov [15]
   gymnasiegrov             `pågående studie… `troligt avbrott el… ongoing
   <chr>                                <dbl>                <dbl>   <dbl>
 1 bygg, el, fordon, hantv…                 7                    3   0.7  
 2 ekonomiprogrammet/ ekon…                34                   21   0.618
 3 ekonomiprogrammet/ juri…                 7                    3   0.7  
 4 estetiska programmet                     5                    2   0.714
 5 friskoleprogram                          2                    0   1    
 6 Handels- och administra…                 3                    1   0.75 
 7 Hotell- och Restaurang                   1                    2   0.333
 8 komvux                                   2                    4   0.333
 9 medieprogrammet/mediepr…                 0                    1   0    
10 naturvetenskapliga prog…                 9                    5   0.643
11 samhälls- och ekonomipr…                 1                    0   1    
12 samhällsvetenskapliga p…                11                    5   0.688
13 specialutformat program                  6                    5   0.545
14 teknikprogrammet                         5                    6   0.455
15 NA                                       8                    3   0.727
1 голос
/ 01 ноября 2019

Эй, вы также можете попробовать простую базу R:

tab = do.call(rbind,
    tapply(fulldata$totstatus_bin,fulldata$gymnasiegrov,table)
)
# calculate the ratio you wanted
tab = data.frame(tab)
tab$ongoing = tab[,1]/rowSums(tab)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...