Как создать таблицы сопряженности (кросс-таблица) для двух категориальных переменных? - PullRequest
0 голосов
/ 31 марта 2020

База данных WHO DownSyndrome дает вам информацию о количестве детей с синдромом Дауна, рожденных от 1М детей для разных переменных.

Я хотел создать кросс-таблицу с абсолютной, относительной и предельной частотами для категориальных переменные Country и Year

Результаты поиска будут выглядеть примерно так:


Year    |      1978           1979            1980      
Country |   ----------------------------------------------------------------------     
ALB     |      76.4             78.5              87.6            ...
AUT     |      87.6             67.9              80.0            …
AZE     |      90.5             78.5              64.8            …

Я попробовал пару вещей:

Сначала создадим новый df для трех переменных:

DS <- dplyr::select(DownSyndrome, YEAR, COUNTRY_REGION, VALUE)

Но я не могу понять, как использовать таблицу и выполнять кросс-функции с этим.

Мне удалось получить абсолютные частоты с помощью:


DS_wide <- DownSyndrome %>%
  pivot_wider(
    names_from = YEAR,
    values_from = VALUE)

Но опять же, я не знаю, как отсюда получить относительную и маржинальную частоты.

Любая помощь приветствуется, спасибо

PS:

Ссылка на базу данных

Image of the data

1 Ответ

1 голос
/ 31 марта 2020

Вот подход dplyr.

Первая строка преобразует длинную форму в широкую форму на основе вашего кода. Вторая строка вычисляет итоги на основе всех столбцов с именами, которые соответствуют шаблону только чисел. Третья строка вычисляет относительный итог для каждой страны. Четвертая строка делит все столбцы с только числами на общий столбец и присваивает их столбцам с суффиксом _RELATIVE.

library(tidyverse)
DownSyndrome %>%
  pivot_wider(names_from = YEAR,values_from = VALUE) %>%
  mutate(TOTAL = rowSums(.[grep("[0-9]+",names(.))],na.rm=TRUE)) %>%
  mutate(TOTAL_RELATIVE = TOTAL / sum(TOTAL)) %>%
  mutate_at(vars(matches("[0-9]+")), list(RELATIVE = ~ ./TOTAL))
# A tibble: 49 x 104
#   COUNTRY COUNTRY_GRP SEX   `2008` `2009` `2010` `2011` `2012` `2013` `2014` `2015` `2016` `2017` `1985` `1986` `1987` `1988`
#   <fct>   <fct>       <fct>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
# 1 ALB     ""          ALL       32     29     42     39     18     28     14     29     23     16     NA     NA     NA     NA
# 2 AUT     ""          ALL       13     16     12      6      6      3     NA     NA     NA     NA     23     29     39     24
# 3 AZE     ""          ALL       38     51     52     42     32     38     49     36     32     38     NA     NA     NA     NA
# 4 BEL     ""          ALL      248    232    275    240    259    245     NA     NA     NA     NA     56    126    152    126
# 5 BGR     ""          ALL       22     32     27     32     38     17     32     32     18     24     NA     NA     NA     NA
# 6 BIH     ""          ALL       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     59     42     75     65
# 7 BLR     ""          ALL       69     60     44     61     46     50     56     53     63     56     NA     NA     NA     NA
# 8 CHE     ""          ALL      121    107    127    145    152    152    131    108    112     86     NA     NA     NA     NA
# 9 CZE     ""          ALL       43     49     46     53     49     45     45     43     NA     NA     NA     NA     NA    116
#10 DEU     ""          ALL      269    288    251    290    298    284    290    296    308    312     NA     NA     NA     NA

Если вам нужны только относительные значения, вы можете использовать select.

DownSyndrome %>%
  pivot_wider(names_from = YEAR,values_from = VALUE) %>%
  mutate(TOTAL = rowSums(.[grep("[0-9]+",names(.))],na.rm=TRUE)) %>%
  mutate(TOTAL_RELATIVE = TOTAL / sum(TOTAL)) %>%
  mutate_at(vars(matches("[0-9]+")), list(RELATIVE = ~ ./TOTAL)) %>%
  select(COUNTRY,matches("RELATIVE"),TOTAL_RELATIVE)

Данные

DownSyndrome <- read.csv("~/HFA_604_EN.csv",skip = 25)
...