在R语言中创建以Counts总和替换频数的2x2交叉表
问题:生成按Sample和Species分组求和的交叉表
我在创建分析所需格式的表格时遇到困难。以下是大型数据集的简化示例:
Sample <- c(1,2,2,3,3) Species <- c("sp1","sp2","sp3","sp1","sp1") Counts <- c(3,2,4,10,3) mydata <- as.data.frame(cbind(Sample,Species,Counts)) mydata$Counts <- as.integer(mydata$Counts) mydata
输出的原始数据集:
Sample Species Counts 1 1 sp1 3 2 2 sp2 2 3 2 sp3 4 4 3 sp1 10 5 3 sp1 3
我用table()函数生成了频数表,格式是需要的Sample×Species交叉结构,但统计的是出现次数:
(table_0 <- table(mydata$Sample,mydata$Species))
输出的频数表:
sp1 sp2 sp3 1 1 0 0 2 0 1 1 3 2 0 0
我需要的是将频数替换为对应组的Counts总和,得到如下结果:
sp1 sp2 sp3 1 3 0 0 2 0 2 4 3 13 0 0
比如Sample 3对应Species "sp1"的两个观测值Counts总和为13。如何为大型数据集自动生成此类表格?
解决方案
方法1:Base R 原生函数xtabs()
这是最简便的原生方法,直接生成求和交叉表,自动填充缺失组合为0:
# 按Sample和Species分组,对Counts求和 sum_table <- xtabs(Counts ~ Sample + Species, data = mydata) sum_table
运行后输出:
Species Sample sp1 sp2 sp3 1 3 0 0 2 0 2 4 3 13 0 0
方法2:Tidyverse 工作流(dplyr + tidyr)
适合习惯tidy风格的用户,输出为data.frame格式,方便后续分析:
library(tidyverse) sum_table_tidy <- mydata %>% # 按Sample和Species分组求和 group_by(Sample, Species) %>% summarise(Total = sum(Counts), .groups = "drop") %>% # 将Species转为列,缺失值填充0 pivot_wider(names_from = Species, values_from = Total, values_fill = 0) sum_table_tidy
方法3:Data.table(超大型数据集首选)
如果数据集规模极大(百万级以上),data.table的运算效率远高于其他方法:
library(data.table) # 转换为data.table格式 setDT(mydata) # 分组求和并转换为交叉表 sum_table_dt <- dcast(mydata, Sample ~ Species, value.var = "Counts", fun.aggregate = sum, fill = 0) sum_table_dt
内容的提问来源于stack exchange,提问作者Sergio Nolazco
相关产品推荐
相关产品推荐

