首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >四舍五入在 Go 语言中为何如此困难?

四舍五入在 Go 语言中为何如此困难?

作者头像
逆锋起笔
发布于 2021-09-08 07:24:49
发布于 2021-09-08 07:24:49
48500
代码可运行
举报
文章被收录于专栏:逆锋起笔逆锋起笔
运行总次数:0
代码可运行

四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法。

而在 Go 语言中这似乎成为了难题,在 stackoverflow 上搜索 [go] Round 会存在大量相关提问,Go 1.10 开始才出现 math.Round 的身影,本以为 Round 的疑问就此结束,但是一看函数注释 Round returns the nearest integer, rounding half away from zero ,这是并不常用的 Round half away from zero 实现呀,说白了就是我们理解的 Round 阉割版,精度为 0 的 Round half up 实现,Round half away from zero 的存在是为了提供一种高效的通过二进制方法得结果,可以作为 Round 精度为 0 时的高效实现分支。

带着对 Round 的‘敬畏’,我在 stackoverflow 翻阅大量关于 Round 问题,开启寻求最佳的答案,本文整理我认为有用的实现,简单分析它们的优缺点,对于不想逐步了解,想直接看结果的小伙伴,可以直接看文末的最佳实现,或者跳转 exmath.Round[1] 直接看源码和使用吧!

Round 第一弹

stackoverflow[2] 问题中的最佳答案首先获得我的关注,它在 mathx.Round[3] 被开源,以下是代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// source: https://github.com/icza/gox/blob/master/mathx/mathx.go
package mathx

import "math"

// AbsInt returns the absolute value of i.
func AbsInt(i int) int {
 if i < 0 {
  return -i
 }
 return i
}

// Round returns x rounded to the given unit.
// Tip: x is "arbitrary", maybe greater than 1.
// For example:
//     Round(0.363636, 0.001) // 0.364
//     Round(0.363636, 0.01)  // 0.36
//     Round(0.363636, 0.1)   // 0.4
//     Round(0.363636, 0.05)  // 0.35
//     Round(3.2, 1)          // 3
//     Round(32, 5)           // 30
//     Round(33, 5)           // 35
//     Round(32, 10)          // 30
//
// For details, see https://stackoverflow.com/a/39544897/1705598
func Round(x, unit float64) float64 {
 return math.Round(x/unit) * unit
}

// Near reports if 2 float64 numbers are "near" to each other.
// The caller is responsible to provide a sensible epsilon.
//
// "near" is defined as the following:
//     near := math.Abs(a - b) < eps
//
// Corner cases:
//  1. if a==b, result is true (eps will not be checked, may be NaN)
//  2. Inf is near to Inf (even if eps=NaN; consequence of 1.)
//  3. -Inf is near to -Inf (even if eps=NaN; consequence of 1.)
//  4. NaN is not near to anything (not even to NaN)
//  5. eps=Inf results in true (unless any of a or b is NaN)
func Near(a, b, eps float64) bool {
 // Quick check, also handles infinities:
 if a == b {
  return true
 }

 return math.Abs(a-b) < eps
}

这个实现非常的简洁,借用了 math.Round,由此看来 math.Round 还是很有价值的,大致测试了它的性能一次运算大概 0.4ns,这非常的快。

但是我也很快发现了它的问题,就是精度问题,这个是问题中一个回答的解释让我有了警觉,并开始了实验。他认为使用浮点数确定精度(mathx.Round 的第二个参数)是不恰当的,因为浮点数本身并不精确,例如 0.05 在 64 位 IEEE 浮点数中,可能会将其存储为 0.05000000000000000277555756156289135105907917022705078125。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//source: https://play.golang.org/p/0uN1kEG30kI
package main

import (
 "fmt"
 "math"
)

func main() {
 f := 12.15807659924030304
 fmt.Println(Round(f, 0.0001)) // 12.158100000000001

 f = 0.15807659924030304
 fmt.Println(Round(f, 0.0001)) // 0.15810000000000002
}

func Round(x, unit float64) float64 {
 return math.Round(x/unit) * unit
}

以上代码可以在 Go Playground[4] 上运行,得到结果并非如期望那般,这个问题主要出现在 math.Round(x/unit) 与 unit 运算时,math.Round 运算后一定会是一个精确的整数,但是 0.0001 的精度存在误差,所以导致最终得到的结果精度出现了偏差。

格式化与反解析

在这个问题中也有人提出了先用 fmt.Sprintf 对结果进行格式化,然后再采用 strconv.ParseFloat 反向解析,Go Playground[5] 代码在这个里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
source: https://play.golang.org/p/jxILFBYBEF
package main

import (
 "fmt"
 "strconv"
)

func main() {
 fmt.Println(Round(0.363636, 0.05)) // 0.35
 fmt.Println(Round(3.232, 0.05))    // 3.25
 fmt.Println(Round(0.4888, 0.05))   // 0.5
}

func Round(x, unit float64) float64 {
 var rounded float64
 if x > 0 {
  rounded = float64(int64(x/unit+0.5)) * unit
 } else {
  rounded = float64(int64(x/unit-0.5)) * unit
 }
 formatted, err := strconv.ParseFloat(fmt.Sprintf("%.2f", rounded), 64)
 if err != nil {
  return rounded
 }
 return formatted
}

这段代码中有点问题,第一是结果不对,和我们理解的存在差异,后来一看第二个参数传错了,应该是 0.01,我想试着调整调整精度吧,我改成了 0.0001 之后发现一直都是保持小数点后两位,我细细研究了下这段代码的逻辑,发现 fmt.Sprintf("%.2f", rounded) 中写死了保留的位数,所以它并不通用,我尝试如下简单调整一下使其生效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "fmt"
 "strconv"
)

func main() {
 f := 12.15807659924030304
 fmt.Println(Round(f, 0.0001)) // 12.1581

 f = 0.15807659924030304
 fmt.Println(Round(f, 0.0001)) // 0.1581

 fmt.Println(Round(0.363636, 0.0001)) // 0.3636
 fmt.Println(Round(3.232, 0.0001))    // 3.232
 fmt.Println(Round(0.4888, 0.0001))   // 0.4888
}

func Round(x, unit float64) float64 {
 var rounded float64
 if x > 0 {
  rounded = float64(int64(x/unit+0.5)) * unit
 } else {
  rounded = float64(int64(x/unit-0.5)) * unit
 }

 var precision int
 for unit < 1 {
  precision++
  unit *= 10
 }

 formatted, err := strconv.ParseFloat(fmt.Sprintf("%."+strconv.Itoa(precision)+"f", rounded), 64)
 if err != nil {
  return rounded
 }
 return formatted
}

确实获得了满意的精准度,但是其性能也非常客观,达到了 215ns/op,暂时看来如果追求精度,这个算法目前是比较完美的。

大道至简

很快我发现了另一个极简的算法,它的精度和速度都非常的高,实现还特别精简:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "fmt"
 "github.com/thinkeridea/go-extend/exmath"
)

func main() {
 f := 0.15807659924030304
 fmt.Println(float64(int64(f*10000+0.5)) / 10000) // 0.1581
}

这并不通用,除非像以下这么包装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Round(x, unit float64) float64 {
 return float64(int64(x*unit+0.5)) / unit
}

unit 参数和之前的概念不同了,保留一位小数 uint =10,只是整数 uint=1, 想对整数部分进行精度控制 uint=0.01 例如:Round(1555.15807659924030304, 0.01) = 1600,Round(1555.15807659924030304, 1) = 1555,Round(1555.15807659924030304, 10000) = 1555.1581。

这似乎就是终极答案了吧,等等……

终极方案

上面的方法够简单,也够高效,但是 api 不太友好,第二个参数不够直观,带了一定的心智负担,其它语言都是传递保留多少位小数,例如 Round(1555.15807659924030304, 0) = 1555,Round(1555.15807659924030304, 2) = 1555.16,Round(1555.15807659924030304, -2) = 1600,这样的交互才符合人性啊。

别急我在 go-extend[6] 开源了 exmath.Round[7],其算法符合通用语言 Round 实现,且遵循 Round half up 算法要求,其性能方面在 3.50ns/op, 具体可以参看调优 exmath.Round 算法[8], 具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//source: https://github.com/thinkeridea/go-extend/blob/main/exmath/round.go

// MIT License
// Copyright (c) 2020 Qi Yin <qiyin@thinkeridea.com>

package exmath

import (
 "math"
)

// Round 四舍五入,ROUND_HALF_UP 模式实现
// 返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零。
func Round(val float64, precision int) float64 {
 if precision == 0 {
  return math.Round(val)
 }

 p := math.Pow10(precision)
 if precision < 0 {
  return math.Floor(val*p+0.5) * math.Pow10(-precision)
 }

 return math.Floor(val*p+0.5) / p
}

总结

Round 功能虽简单,但是受到 float 精度影响,仍然有很多人在四处寻找稳定高效的算法,参阅了大多数资料后精简出 exmath.Round[9] 方法,期望对其他开发者有所帮助,至于其精度使用了大量的测试用例,没有超过 float 精度范围时并没有出现精度问题,未知问题等待社区检验,具体测试用例参见 round_test[10]

原文链接:https://blog.thinkeridea.com/202101/go/round.html 作者:戚银

参考资料

[1]

exmath.Round: https://github.com/thinkeridea/go-extend/blob/main/exmath/round.go#L12

[2]

stackoverflow: https://stackoverflow.com/questions/39544571/golang-round-to-nearest-0-05

[3]

mathx.Round: https://github.com/icza/gox/blob/master/mathx/mathx.go#L26

[4]

Go Playground: https://play.golang.org/p/0uN1kEG30kI

[5]

Go Playground: https://play.golang.org/p/jxILFBYBEF

[6]

go-extend: https://github.com/thinkeridea/go-extend

[7]

exmath.Round: https://github.com/thinkeridea/go-extend/blob/main/exmath/round.go

[8]

调优 exmath.Round 算法: https://github.com/thinkeridea/go-extend/pull/13

[9]

exmath.Round: https://github.com/thinkeridea/go-extend/blob/main/exmath/round.go

[10]

round_test: https://github.com/thinkeridea/go-extend/blob/main/exmath/round_test.go

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逆锋起笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
追风少年i
2024/11/04
1530
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
生信菜鸟团
2024/12/20
2130
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
课前准备----高通量单细胞分析数据集中的体细胞突变检测
体细胞突变在单细胞分辨率上的表征对于研究癌症进化、克隆嵌合和细胞可塑性至关重要。 体细胞突变在单细胞分辨率上的表征对于研究癌症中的遗传异质性和细胞可塑性、非肿瘤组织中的克隆嵌合体以及确定在恶性细胞和表型正常细胞中起作用的突变过程至关重要。单细胞基因组测序为研究单细胞突变提供了最直接的方法。 单细胞基因组测序的一种替代策略包括直接从高通量单细胞测定中检测测序reads中的体细胞突变,如scRNA-seq和scATAC-seq。这种方法的主要优点是可以利用单细胞分析的高通量来绘制细胞谱系的转录或调控程序,而不需要复杂的实验方案来联合分析来自同一细胞的DNA和RNA。然而,由于不同细胞类型的基因表达的可变性、等位基因脱落事件、RNA编辑、有限的覆盖深度和测序产物,突变的检测受到很大限制。因此,现有的算法依赖于检测突变,如单核苷酸变异(SNV)或indel,这些突变以前是通过匹配的bulk或单细胞DNA测序数据确定的。
追风少年i
2024/09/08
1650
课前准备----高通量单细胞分析数据集中的体细胞突变检测
你的单细胞数据集还可以分析体细胞突变
单细胞水平上的体细胞突变特征对于研究癌症进化、克隆镶嵌和细胞可塑性至关重要。传统的单细胞基因组测序方法在可扩展性和基因组丢失率方面存在挑战。另一策略是从scRNA-seq 和 scATAC-seq 检测体细胞突变,这种方法的主要优点是可以将细胞谱系映射到转录或调控程序,但由于不同细胞类型的基因表达差异、等位基因脱落事件、RNA 编辑、有限的覆盖深度和测序伪影,突变的检测受到严重限制。因此,现有算法检测体细胞突变具有局限性。因此,研究团队开发了一种名为SComatic的算法,旨在直接检测 scRNA-seq 和ATAC-seq(可及染色质序列测定)数据集中的体细胞突变,而无需匹配的大量或单细胞DNA测序数据。
生信菜鸟团
2024/07/31
4990
你的单细胞数据集还可以分析体细胞突变
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
癌症的进展由体细胞突变和染色质重塑共同驱动,包括核苷酸变异(SNV)、体细胞拷贝数变异(CNA)和大规模结构变异等。对批量肿瘤或分离单细胞中的体细胞突变进行测序可揭示肿瘤内部的遗传异质性,并能重建肿瘤的进化史;肿瘤之间也表现出异质性,并能够在物理空间内发生进展。分析肿瘤在时间和空间上的体细胞进化是癌症研究中的一个关键挑战,常因缺乏空间数据而受阻。
DrugAI
2024/11/23
1600
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
你真的理解体细胞突变吗?
在测序早期,由于该过程高强度的劳动仅测序了少量的碱基。在动物模型和细胞系中,人们确定了一些在肿瘤发病机理中起着重要作用的基因。随后,研究人员在患者样本中分析了这些突变并评估了它们对预后效果的影响。例如:TP53在各种癌症中普遍发生了突变,NPM1是现在急性髓细胞白血病最常分析的基因之一,该突变定义了当前世界卫生组织分类中的急性髓细胞性白血病亚型。
生信技能树
2020/09/29
5K0
你真的理解体细胞突变吗?
【生信文献200篇】21 使用单细胞多组学探索TNBC病人的新辅助化疗疗效
英文标题:Chemoresistance Evolution in Triple-Negative Breast Cancer Delineated by Single-Cell Sequencing
生信菜鸟团
2021/03/23
1.6K0
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
Tracking the Evolution of Non–Small-Cell Lung Cancer
作图丫
2022/03/29
7130
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
生信菜鸟团
2025/02/18
1590
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
10X单细胞空间数据分析之SNP检测篇
Cellsnp-lite是在C/ c++中实现的,并执行每个细胞基因分型,supporting both with (mode 1) and without (mode 2) given SNPs。在后一种情况下,杂合snp将被自动检测。Cellsnp-lite适用于基于液滴的(例如10XGenomics数据)和well-based的平台(例如SMART-seq2数据)。
追风少年i
2023/04/29
9430
10X单细胞空间数据分析之SNP检测篇
单细胞水平的肿瘤拷贝数分析新方法
它提出来了 single-cell inferred chromosomal copy number variation (sciCNV), a tool for inferring single-cell CNVs from scRNA-seq at 19-46 Mb resolution.
生信技能树jimmy
2023/08/31
4790
单细胞水平的肿瘤拷贝数分析新方法
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
追风少年i
2025/07/03
1150
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
肿瘤化疗无效是对预先存在的突变的选择还是诱发新突变,Cell给你答案
三阴乳腺癌(TNBC)是乳腺癌的一种侵袭性亚型,是指雌激素受体(ER),孕激素受体(PR)和原癌基因(HER-2)均为阴性的乳腺癌,常对化疗产生耐药性。而耐药性的产生到底是之前存在的稀有突变细胞受到选择还是新基因突变导致的,仍是一个谜团。 为研究该问题,Charissa Kim等人利用混合细胞外显子测序以及单细胞DNA和RNA测序,对新辅助化疗(NAC)期间20名TNBC患者进行跟踪分析。深度外显子组测序结果显示10例病人化疗后原始突变消失,清除了所有肿瘤细胞;10例病人化疗后突变依然存在。对其中8位患者(
生信宝典
2018/06/26
8940
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
今天跟大家分享的是2020年2月发表在Nature(IF:43.07)杂志上的一篇文章“Genomic basis for RNA alterations in cancer”.在文章中研究者们提出了一个跨越27种不同的肿瘤类型的全面的RNA水平变化目录,在基因组背景下,这种RNA改变为鉴定与癌症相关的功能基因和机制提供了丰富的资源。
生信菜鸟团
2020/08/04
1.3K0
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
◉ a,遗传变异、早期体细胞突变和晚期体细胞突变之间的示意图比较。◉ b,体细胞突变的原因及类型概览。EN,核酸内切酶;ME,可移动元件;ORF,开放阅读框;RT,逆转录酶;ssDNA,单链DNA。◉ c,不同发育阶段和组织中报道的体细胞单核苷酸变异(SNV)突变率概览。第一次细胞分裂的数据6,7,59 和后续细胞分裂的数据6,7,59 为每次细胞分裂每细胞的SNV数目。◉ 早期中枢神经系统(CNS)9 和胎盘62 的胎儿发育数据为每天每细胞的SNV数目。◉ 成年阶段的数据以每年为单位,估算对象包括生精小管48、造血干细胞26,52,144、B淋巴细胞52、神经元63,145、T淋巴细胞52、支气管上皮53、胃上皮146、子宫内膜上皮79、肝细胞19、小肠上皮19,115、结直肠上皮19,24,29 以及心肌细胞49。◉ ZGA,合子基因组激活。
生信菜鸟团
2025/07/04
1840
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
结直肠癌(CRC)进展的遗传模型定义了驱动人类结肠上皮发育不良和恶性肿瘤的突变事件的累积序列。这种传统的腺瘤-癌轨迹涉及驱动基因APC、KRAS和TP53的改变,导致染色体不稳定(CIN)。另外,来自所谓的serrated pathway的sporadic CRC的一个subset更可能是BRAF驱动的微卫星不稳定(MSI-H),主要是由于MLH1的双等位基因高甲基化,导致高突变。几十年来的研究已经产生了更多的CRC亚型,阐明了侵袭和转移的替代途径,以及恶性病变前的特征及其临床预后。最近,单细胞和空间分子分析的出现以高分辨率揭示了不同程度的肿瘤内异质性,这表明先前提出的沿常规或锯齿状途径的线性肿瘤进展不能完全解释全球癌症相关死亡的第二大原因的进化动力学。此外,来自空间分辨分析的分层分子信息可用于建立与基因和蛋白质表达或细胞“状态”相关的模型,以跨肿瘤区域的克隆身份。以这种方式对肿瘤系统地理学进行探索,可以在考虑区域异质性的同时,对进化关系进行更深入的分析。
追风少年i
2024/02/14
4230
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
神经母细胞瘤是一种外周交感神经系统的小儿肿瘤。肿瘤的表现从自发退化到无法治愈的进展不等。尽管有广泛的治疗,如化疗、手术、放射治疗和免疫治疗,高风险神经母细胞瘤患者的存活率仍低于50%。在大多数患者中,可以观察到对治疗的初步反应,然而,这些患者中高达60%的患者随后复发,并伴有难治性肿瘤。一些遗传变异,包括MYCN扩增和染色体节段性改变,如1p缺失、11q缺失或17q扩增,与预后不良有关。然而,尚不清楚哪些遗传缺陷与疾病复发有关。
作图丫
2022/03/29
6720
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
以往的大规模测序项目已经确定了许多公认的癌症基因,但大部分工作都集中在蛋白质编码基因的突变和拷贝数改变上,主要使用全外显子组测序和单核苷酸多态性阵列数据。全基因组测序使系统地调查非编码区域的潜在driver事件成为可能,包括单核苷酸变异(SNVs),小的插入和缺失(indels)和更大的结构变异。全基因组测序能够精确定位结构变异断点(breakpoints)和不同基因组位点之间的连接( juxtapositions并置)。虽然以前的小规模样本的全基因组测序分析已经揭示了候选的非编码调控driver事件,但这些事件的频率和功能含义仍然缺乏研究。
作图丫
2022/03/29
8320
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
三阴性乳腺癌经常进展为转移性疾病,导致生存率较差,过去的研究表明其存在广泛的瘤内异质性ITH,对化疗产生耐药性。而单细胞基因组测序 scDNA-seq 是研究 ITH 的一种重要方法,过去在方法进行 WGS 可以用于拷贝数变异分析,但是对于突变分析需要较高的测序深度。因此作者认为应该进行单细胞基因组区域测序(外显子或靶向),并开发出来 MPT-scDNAseq方法。该方法结合了批量 DNA 测序、基于单细胞液滴的微流体和定制的靶向面板。
生信菜鸟团
2024/03/25
3900
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
第 2 章 描述了当正常细胞转化为癌细胞时,在不同分子水平上发生的一系列失调现象。突变(mutations)的逐步累积以及在肿瘤进展(tumour progression)过程中发生的事件会在以下各个层次上扰乱细胞的正常行为(参见图 3.1):
生信菜鸟团
2024/11/23
2010
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
推荐阅读
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
1530
算法开发 | 从空间解析转录组学推断等位基因特异性拷贝数异常和肿瘤系统地理学
2130
课前准备----高通量单细胞分析数据集中的体细胞突变检测
1650
你的单细胞数据集还可以分析体细胞突变
4990
Nat. Methods | 新算法利用空间转录组数据构建肿瘤的“空间进化图谱”
1600
你真的理解体细胞突变吗?
5K0
【生信文献200篇】21 使用单细胞多组学探索TNBC病人的新辅助化疗疗效
1.6K0
肿瘤多区域取样的进化分析五:追踪非小细胞肺癌的进展
7130
现在发在NG上的癌症全面基因组分析跟几年前的有什么不同?
1590
10X单细胞空间数据分析之SNP检测篇
9430
单细胞水平的肿瘤拷贝数分析新方法
4790
课前准备---为什么CNV在单细胞空间数据上可以检测肿瘤细胞?
1150
肿瘤化疗无效是对预先存在的突变的选择还是诱发新突变,Cell给你答案
8940
这篇发在Nature上的泛癌RNA alterations能给我们带来哪些思考?
1.3K0
Nature | SMath:从19个非患病组织部位的150名捐献者中生成体细胞变异参考目录
1840
10X单细胞、空间、WES测序分析揭示肿瘤微环境进化区域异质性
4230
肿瘤多区域取样的进化分析六:复发的神经母细胞瘤表现频繁的RAS-MAPK通路突变
6720
Nature:分析2658例癌症样本的全基因组中非编码体细胞的driver
8320
Bulk WES 和单细胞DNA测序重建肿瘤突变谱系
3900
读书笔记 | 癌症计算系统生物学 | 第 03 章 实验性高通量癌症研究技术
2010
相关推荐
从空间解析转录组学推断等位基因特异性拷贝数畸变和肿瘤系统图谱
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档