[英]How to create a contingency tables (crosstab) for two categorical variables?
WHO 唐氏綜合症數據庫為您提供了有關不同變量下 100 萬嬰兒出生的唐氏綜合症嬰兒數量的信息。
我想為分類變量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:
這是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.