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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:17:31