数据准备
df <- read.table(file = "D:/Documents/R wd/df.csv", header = T, sep = ",", colClasses = c(year = "character", nitrogen = "character", variety = "character", block = "character")) # 数据导入。
df # 查看数据。
## year nitrogen variety block v1 v2 v3 v4
## 1 2020 N1 a 1 1.26 2.14 3.4 4.66
## 2 2020 N1 a 2 1.20 2.90 4.1 5.30
## 3 2020 N1 a 3 1.30 3.00 4.3 5.60
## 4 2020 N1 b 1 1.08 1.72 2.8 3.88
## 5 2020 N1 b 2 1.05 1.65 2.7 3.75
## 6 2020 N1 b 3 1.15 1.35 2.5 3.65
## 7 2020 N2 a 1 1.32 3.78 5.1 6.42
## 8 2020 N2 a 2 1.28 4.32 5.6 6.88
## 9 2020 N2 a 3 1.35 3.95 5.3 6.65
## 10 2020 N2 b 1 1.33 3.47 4.8 6.13
## 11 2020 N2 b 2 1.28 2.72 4.0 5.28
## 12 2020 N2 b 3 1.30 3.90 5.2 6.50
## 13 2021 N1 a 1 1.19 3.61 4.8 5.99
## 14 2021 N1 a 2 1.21 3.29 4.5 5.71
## 15 2021 N1 a 3 1.24 3.26 4.5 5.74
## 16 2021 N1 b 1 1.09 2.71 3.8 4.89
## 17 2021 N1 b 2 1.28 2.32 3.6 4.88
## 18 2021 N1 b 3 1.35 1.95 3.3 4.65
## 19 2021 N2 a 1 1.45 4.35 5.8 7.25
## 20 2021 N2 a 2 1.40 3.80 5.2 6.60
## 21 2021 N2 a 3 1.37 4.23 5.6 6.97
## 22 2021 N2 b 1 1.28 2.72 4.0 5.28
## 23 2021 N2 b 2 1.15 3.35 4.5 5.65
## 24 2021 N2 b 3 1.24 3.46 4.7 5.94
7.2 频数表和列联表
频数表是数理统计中由于所观测的数据较多,为简化计算,将这些数据按等间隔分组,然后按选举唱票法数出落在每个组内观测值的个数,称为(组)频数。这样得到的表称“频数表”或“频数分布表”。
列联表(contingency table)是观测数据按两个或更多属性(定性变量)分类时所列出的频数表。它是由两个以上的变量进行交叉分类的频数分布表。列联表可以告诉你组成表格的各种变量组合的频数或比例。列联表分析的基本问题是:观察各属性之间是否独立,做简单的描述性统计。
按两个变量交叉分类的,该列联表称为两维列联表;若按3个变量交叉分类,所得的列联表称为3维列联表,依次类推。一维列联表就是频数分布表。频数就是各个分组中属性出现的次数。
7.2.1 生产频数表
1.一维列联表
head(df) # 以df数据为例。
## year nitrogen variety block v1 v2 v3 v4
## 1 2020 N1 a 1 1.26 2.14 3.4 4.66
## 2 2020 N1 a 2 1.20 2.90 4.1 5.30
## 3 2020 N1 a 3 1.30 3.00 4.3 5.60
## 4 2020 N1 b 1 1.08 1.72 2.8 3.88
## 5 2020 N1 b 2 1.05 1.65 2.7 3.75
## 6 2020 N1 b 3 1.15 1.35 2.5 3.65
mytable <- with(df, table(year)) # 使用table()生成简单频数统计表。
mytable # 返回结果。
## year
## 2020 2021
## 12 12
prop.table(mytable) # 将频数转化为比例值。
## year
## 2020 2021
## 0.5 0.5
prop.table(mytable)*100 # 将频数转化为百分比。
## year
## 2020 2021
## 50 50
2.二维列联表
table(A, B)
其中,A是行变量,B是列变量。
xtabs(~ A + B, data = mydata)
其中的mydata是一个矩阵或数据框。总的来说,要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以+作为分隔符。
mytable1 <- xtabs(~ year + nitrogen, data = df) # 创建二维列联表。
mytable1 # 返回结果。
## nitrogen
## year N1 N2
## 2020 6 6
## 2021 6 6
margin.table(mytable1, 1) # 生成行边际频数,即行和。下标1指代table()语句中的第一个变量。
## year
## 2020 2021
## 12 12
prop.table(mytable1, 1) # 生成行边际频数比例,即行比例。
## nitrogen
## year N1 N2
## 2020 0.5 0.5
## 2021 0.5 0.5
margin.table(mytable1, 2) # 生成列边际频数,即列和。下标2指代table()语句中的第二个变量。
## nitrogen
## N1 N2
## 12 12
prop.table(mytable1, 2) # 生成列边际频数比例,即列比例。
## nitrogen
## year N1 N2
## 2020 0.5 0.5
## 2021 0.5 0.5
addmargins(mytable1) # 为表格添加边际和。
## nitrogen
## year N1 N2 Sum
## 2020 6 6 12
## 2021 6 6 12
## Sum 12 12 24
addmargins(prop.table(mytable1)) # 为表格添加比例边际和。
## nitrogen
## year N1 N2 Sum
## 2020 0.25 0.25 0.50
## 2021 0.25 0.25 0.50
## Sum 0.50 0.50 1.00
addmargins(prop.table(mytable1, 1), 2) # 为表格添加行比例边际和。
## nitrogen
## year N1 N2 Sum
## 2020 0.5 0.5 1.0
## 2021 0.5 0.5 1.0
addmargins(prop.table(mytable1, 2), 1) # 为表格添加行比例边际和。
## nitrogen
## year N1 N2
## 2020 0.5 0.5
## 2021 0.5 0.5
## Sum 1.0 1.0
gmodels包CrossTable()
library(gmodels) # 调用gmodels包。
CrossTable(df$year, df$nitrogen) # CrossTable包生成二维列联表。
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 24
##
##
## | df$nitrogen
## df$year | N1 | N2 | Row Total |
## -------------|-----------|-----------|-----------|
## 2020 | 6 | 6 | 12 |
## | 0.000 | 0.000 | |
## | 0.500 | 0.500 | 0.500 |
## | 0.500 | 0.500 | |
## | 0.250 | 0.250 | |
## -------------|-----------|-----------|-----------|
## 2021 | 6 | 6 | 12 |
## | 0.000 | 0.000 | |
## | 0.500 | 0.500 | 0.500 |
## | 0.500 | 0.500 | |
## | 0.250 | 0.250 | |
## -------------|-----------|-----------|-----------|
## Column Total | 12 | 12 | 24 |
## | 0.500 | 0.500 | |
## -------------|-----------|-----------|-----------|
##
##
3.多维列联表
mytable2 <- xtabs(~ year + nitrogen + variety, data = df) # 生成三维列联表。
mytable2 # 返回结果。
## , , variety = a
##
## nitrogen
## year N1 N2
## 2020 3 3
## 2021 3 3
##
## , , variety = b
##
## nitrogen
## year N1 N2
## 2020 3 3
## 2021 3 3
ftable(mytable2) # 更为紧凑和吸引人的表格。
## variety a b
## year nitrogen
## 2020 N1 3 3
## N2 3 3
## 2021 N1 3 3
## N2 3 3
margin.table(mytable2, 1) # 调出year列联表。
## year
## 2020 2021
## 12 12
margin.table(mytable2, 2) # 调出nitrogen列联表。
## nitrogen
## N1 N2
## 12 12
margin.table(mytable2, 3) # 调出variety列联表。
## variety
## a b
## 12 12
margin.table(mytable2, c(1,3)) # 调出year和pattern列联表。
## variety
## year a b
## 2020 6 6
## 2021 6 6
ftable(prop.table(mytable2, c(1,2))) # year和nitrogen的边际频数。
## variety a b
## year nitrogen
## 2020 N1 0.5 0.5
## N2 0.5 0.5
## 2021 N1 0.5 0.5
## N2 0.5 0.5
ftable(prop.table(mytable2, c(1,2)), 3) # year和nitrogen的边际频数,以variety统计。
## variety a b
## year nitrogen
## 2020 N1 0.5 0.5
## N2 0.5 0.5
## 2021 N1 0.5 0.5
## N2 0.5 0.5
ftable(addmargins(prop.table(mytable2, c(1,2)), 3))*100 # year和nitrogen的边际频数,以variety统计,并显示百分比。
## variety a b Sum
## year nitrogen
## 2020 N1 50 50 100
## N2 50 50 100
## 2021 N1 50 50 100
## N2 50 50 100
参考资料:
- 《R语言实战》(中文版),人民邮电出版社,2013.
- 频数表,https://baike.baidu.com/item/%E9%A2%91%E6%95%B0%E8%A1%A8/10127969?fr=aladdin
- 列联表,https://baike.baidu.com/item/%E5%88%97%E8%81%94%E8%A1%A8/6547006?fr=aladdin
- R实战 第十篇:列联表和频数表,https://www.cnblogs.com/ljhdo/p/4484246.html