在R中按性别、品种组和年龄聚合数据集统计个体数量
解决方案
思路说明
你需要先把宽格式的年龄列转换为长格式——因为你的年龄数据分散在13列里,直接用aggregate没法跨列统计。转成窄表后过滤掉空值(死亡个体的记录),再按品种组、年龄、性别分组计数即可。
方法一:使用tidyverse工具包(推荐)
如果还没安装tidyverse,先执行安装命令:
install.packages("tidyverse")
然后处理数据:
library(tidyverse) # 假设你的数据集名为df,13个年龄列是第3到15列(或直接列名,比如Age_2010:Age_2022) long_data <- df %>% # 将所有年龄列转成长表,保留Sex和Group,新增Year(可忽略)和Age列 pivot_longer(cols = -c(Sex, Group), names_to = "Year", values_to = "Age") %>% # 过滤掉年龄为空的行(即个体已死亡的记录) drop_na(Age) %>% # 确保Age是数值型(如果原始数据是字符格式的话) mutate(Age = as.numeric(Age)) # 分组统计数量 final_result <- long_data %>% group_by(Group, Age, Sex) %>% summarize(Count = n(), .groups = "drop")
方法二:使用Base R(无需额外包)
如果不想安装工具包,用原生R代码处理:
# 将宽表转成长表 long_data <- reshape(df, varying = names(df)[-c(1,2)], # 指定所有年龄列(排除Sex和Group) v.names = "Age", timevar = "Year", times = names(df)[-c(1,2)], direction = "long") # 过滤空值并转换Age为数值型 long_data <- long_data[!is.na(long_data$Age), ] long_data$Age <- as.numeric(long_data$Age) # 用aggregate统计计数 final_result <- aggregate(data = long_data, Count ~ Group + Age + Sex, FUN = length)
结果说明
最终的final_result表包含四列:Group(品种组)、Age(年龄)、Sex(性别)、Count(对应分组的个体数量),完全匹配你的统计需求。
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

