《R语言实战》自学笔记41-生成频数表

数据准备

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 生产频数表

image.png

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

参考资料:

  1. 《R语言实战》(中文版),人民邮电出版社,2013.
  2. 频数表,https://baike.baidu.com/item/%E9%A2%91%E6%95%B0%E8%A1%A8/10127969?fr=aladdin
  3. 列联表,https://baike.baidu.com/item/%E5%88%97%E8%81%94%E8%A1%A8/6547006?fr=aladdin
  4. R实战 第十篇:列联表和频数表,https://www.cnblogs.com/ljhdo/p/4484246.html

你可能感兴趣的:(《R语言实战》自学笔记41-生成频数表)