在R中为树木胸径-树高数据创建双向频率分布表的问题
别担心,这个需求其实是R里处理分类数据时非常常见的操作,我来一步步带你完成双向频率分布表的创建~
首先,你已经成功完成了单变量的分组和频数统计,接下来只需要把树高也做同样的分组处理,然后用table()函数把两个分组变量结合起来就行,具体步骤如下:
1. 完成树高(tht)的分组处理
和你处理胸径的逻辑完全一致:先确定树高的范围,生成对应的分组区间,再用cut()函数把树高数据分到各个区间里。
沿用你已有的代码基础,可以这样扩展:
# 读取数据(你已经完成这一步) data <- read.csv('data.csv') # 处理胸径分组(沿用你之前的代码) diameter <- data$dbh breaks_dbh <- seq(6, 61, by=4) data$dbh_cut <- cut(diameter, breaks_dbh, right = FALSE) # 处理树高分组 tht <- data$tht # 根据你的分组规则(3-4.9,5-6.9...),步长设为2,确保覆盖所有树高数据 breaks_tht <- seq(3, max(tht) + 2, by=2) data$tht_cut <- cut(tht, breaks_tht, right = FALSE)
2. 创建双向交叉频率表
直接用table()函数,把两个分组后的变量作为参数传入就行——第一个参数会成为表格的行(胸径分组),第二个参数成为表格的列(树高分组),单元格里的数值就是对应分组组合的频数:
# 生成交叉频率表 cross_freq_table <- table(data$dbh_cut, data$tht_cut) # 查看结果 print(cross_freq_table)
举个例子,用你提供的10行样本数据来演示,运行后会得到类似这样的结果:
[7,9) [13,15) [15,17) [17,19) [30,32) [53,55) [8,12) 3 0 0 0 0 0 [16,20) 0 1 0 0 0 0 [22,26) 0 0 1 1 0 0 [26,30) 0 0 1 0 0 0 [44,48) 0 0 0 0 1 0 <NA> 0 0 0 0 0 1
(注:样本里的胸径3不在你设置的[6,10)及以后的分组里,所以会显示<NA>,你可以调整breaks_dbh的起始值比如改成seq(0,61,by=4)来包含这类数据)
3. 可选:生成比例表(按需使用)
如果你需要查看每个胸径分组内树高分组的占比,可以用prop.table()函数:
# 按行计算比例(每个胸径分组内的树高分布占比) row_prop_table <- prop.table(cross_freq_table, margin = 1) # 按列计算比例(每个树高分组内的胸径分布占比) col_prop_table <- prop.table(cross_freq_table, margin = 2)
小提示
- 如果觉得默认的表格输出不够美观,可以用
as.data.frame(cross_freq_table)把结果转换成数据框格式,或者安装knitr包后用knitr::kable(cross_freq_table)生成更整洁的表格。 - 也可以用
xtabs()函数来生成交叉表,写法是xtabs(~ dbh_cut + tht_cut, data = data),结果和table()完全一致,只是语法更偏向公式风格。
刚开始用R遇到这类问题太正常啦,多练几次就熟练啦~
内容的提问来源于stack exchange,提问作者Onur Alkan
相关产品推荐
相关产品推荐

