簡體   English   中英

如何為兩個分類變量創建列聯表(交叉表)?

[英]How to create a contingency tables (crosstab) for two categorical variables?

WHO 唐氏綜合症數據庫為您提供了有關不同變量下 100 萬嬰兒出生的唐氏綜合症嬰兒數量的信息。

我想為分類變量CountryYear創建一個具有絕對、相對和邊際頻率的交叉表

願望結果將類似於:


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:

鏈接到數據庫

數據圖像

這是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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM