You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:05