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

如何在R语言中将4×16三核苷酸计数表转为4×4汇总表

将4×16三核苷酸计数矩阵简化为4×4矩阵

问题描述

现有如下三核苷酸计数数据:

aaa  aac  aag  aat  aca  acc  acg  act  aga  agc  agg  agt  ata  atc  atg  att  caa  cac  cag  cat  cca  ccc  ccg  cct 
1501  895  660  989  759  858  658  524  667  878  608  621  897  983  901 1030  669  713 1381  708  610  514 1308  542 
 cga  cgc  cgg  cgt  cta  ctc  ctg  ctt  gaa  gac  gag  gat  gca  gcc  gcg  gct  gga  ggc  ggg  ggt  gta  gtc  gtg  gtt 
 516  888 1398  664  196  410 1371  523 1071  624  519 1118 1045  881 1007  835  894 1037  734  915  618  660  862  863 
 taa  tac  tag  tat  tca  tcc  tcg  tct  tga  tgc  tgg  tgt  tta  ttc  ttg  ttt 
 805  567  214  996 1057  721  493  599 1255  965  840  803  871  816  729 1364 

已通过以下R代码生成4×16的矩阵R:

triple <- count(morseq, wordsize=3)
triple
R <- matrix(triple,4,16,byrow=T)
colnames(R) <- c("aa","ac","ag","at","ca","cc","cg","ct","ga","gc","gg","gt","ta","tc","tg","tt") ## 给列命名
row.names(R) <- c("a","c","g","t")

需要将该矩阵简化为4×4矩阵:行代表三核苷酸的第一个碱基,列代表第三个碱基,对4×16矩阵中首尾碱基匹配的对应值求和,预期格式如下:

a   c    g    t   
a   x   x    x    x  
c   x   x    x    x  
g   x   x    x    x  
t   x   x    x    x 

解决方案

方法1:基础R实现

通过提取列名的第三个碱基,按行分组求和:

# 提取每个列名的第三个碱基(列名的第二个字符)
third_bases <- substr(colnames(R), 2, 2)

# 初始化4×4结果矩阵,设置行名和列名
result_matrix <- matrix(0, nrow = 4, ncol = 4, 
                        dimnames = list(c("a", "c", "g", "t"), c("a", "c", "g", "t")))

# 遍历每一行,按第三个碱基分组求和并赋值
for (row_name in rownames(result_matrix)) {
  row_data <- R[row_name, ]
  # 按第三个碱基分组计算总和
  sum_values <- tapply(row_data, third_bases, sum)
  # 将结果填入对应位置
  result_matrix[row_name, names(sum_values)] <- sum_values
}

# 查看最终结果
result_matrix

方法2:tidyverse风格实现

如果熟悉dplyr和tidyr,可以用更简洁的代码:

library(dplyr)
library(tidyr)
library(tibble)

# 将矩阵转换为长格式,分组求和后转回宽格式矩阵
result_matrix <- R %>% 
  as_tibble(rownames = "first_base") %>%
  pivot_longer(-first_base, names_to = "last_two", values_to = "count") %>%
  mutate(third_base = substr(last_two, 2, 2)) %>%
  group_by(first_base, third_base) %>%
  summarise(total = sum(count), .groups = "drop") %>%
  pivot_wider(names_from = third_base, values_from = total) %>%
  column_to_rownames("first_base") %>%
  as.matrix()

# 查看结果
result_matrix

两种方法都能得到符合要求的4×4矩阵,其中每个位置的值是对应第一个碱基和第三个碱基的所有三核苷酸计数之和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:05:17