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

R语言如何按2cm体长分箱创建物种观测计数表?

实现方法

你可以通过「体长分箱-分组汇总-长宽转换」三步完成需求,下面提供两种常用实现方案:


方案1:tidyverse 简洁实现(推荐)

代码逻辑清晰,参数调整方便:

library(dplyr)
library(tidyr)

# 1. 定义2cm间隔的分箱断点、对应列名标签
# 如需调整分箱范围,直接修改seq的起止值即可
break_points <- seq(11, 21, by = 2)
bin_names <- paste0("L", break_points[-length(break_points)], "_", break_points[-1] - 1)

result <- df %>%
  # 为每条记录匹配对应的体长分箱
  mutate(
    length_bin = cut(
      length,
      breaks = break_points,
      labels = bin_names,
      right = FALSE, # 区间为左闭右开,和Lx_y标签的数值范围完全匹配
      include.lowest = TRUE
    )
  ) %>%
  # 按物种、站点、分箱分组,累加观测计数
  group_by(species, station, length_bin) %>%
  summarise(count_sum = sum(count), .groups = "drop") %>%
  # 转换为宽表,没有数据的分箱自动填0
  pivot_wider(
    names_from = length_bin,
    values_from = count_sum,
    values_fill = 0
  ) %>%
  # 调整列顺序和示例一致
  select(species, station, all_of(bin_names))

运行后result和你给出的目标表结构完全一致。如果需要调整分箱归属,修改cut的right参数或者break_points即可。


方案2:Base R 实现(无需安装第三方包)

如果不想加载额外扩展包,可以用R原生函数实现:

# 同样定义分箱断点和标签
break_points <- seq(11, 21, by = 2)
bin_names <- paste0("L", break_points[-length(break_points)], "_", break_points[-1] - 1)

# 匹配分箱
df$length_bin <- cut(
  df$length,
  breaks = break_points,
  labels = bin_names,
  right = FALSE,
  include.lowest = TRUE
)

# 交叉汇总计数
agg_df <- as.data.frame(xtabs(count ~ species + station + length_bin, data = df))

# 转换为宽表
cnt_table <- reshape(
  agg_df,
  idvar = c("species", "station"),
  timevar = "length_bin",
  direction = "wide"
)

# 整理列名、填充缺失值、调整顺序
colnames(cnt_table) <- gsub("^Freq\\.", "", colnames(cnt_table))
cnt_table[, bin_names][is.na(cnt_table[, bin_names])] <- 0
cnt_table <- cnt_table[, c("species", "station", bin_names)]

注:你给出的示例结果中length=12的记录被归到了L13_14列,这是分箱区间偏移导致的,只要把上述代码的break_points改成seq(12, 22, by=2),同步调整标签即可得到和示例完全一致的数值。


内容的提问来源于stack exchange,提问作者TKH_9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:09:11