首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中记录(x+ 1)个数据帧或矩阵

如何在R中记录(x+ 1)个数据帧或矩阵
EN

Stack Overflow用户
提问于 2021-10-12 05:39:08
回答 2查看 159关注 0票数 0

我是编程新手,正在做一些基因表达分析。我有一个非常天真的问题。我有几个基因表达数据框,以基因名称为行,以细胞名称为列Example gene exp. data frame。我想对数据进行对数转换,但是把log2和log+1搞混了。如何对R中的数据帧执行log2+1 ( log (x + 1))转换?它和log2转换是一样的吗?我应该做t=log(v+1)吗?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-12 06:46:31

Park's answer提供了对仅数值的data.frame进行对数转换的最简单方法,但log(x+1, base = b)是一个不同的问题。

log(x + 1)

但如果转换为y <- log(x + 1) (可能是以2为基数),则要小心浮点问题。对于非常小的abs(x)值,log(x + 1, base = b)的结果是不可靠的。

代码语言:javascript
运行
复制
x <- seq(.Machine$double.eps, .Machine$double.eps^0.5, length.out = 10)
eq <- log(x + 1) == log1p(x)
eq
#[1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
which(eq)
#[1]  1  4  7 10

这就是为什么基数R有一个函数log1p。要计算log(x + 1, base = 2)或等效的log2(x + 1),请使用

代码语言:javascript
运行
复制
log2p1 <- function(x) log1p(x)/log(2)

eq2 <- log2(x + 1) == log2p1(x)

eq2
# [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE
which(eq2)
#[1]  7 10

在这两种情况下,log(x + 1)和数值上更精确的版本之间的差异在绝对值上都比.Machine$double.eps小。

代码语言:javascript
运行
复制
abs(log(x + 1) - log1p(x)) < .Machine$double.eps
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
abs(log2(x + 1) - log2p1(x)) < .Machine$double.eps
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
票数 1
EN

Stack Overflow用户

发布于 2021-10-12 05:49:35

例如dummy数据

代码语言:javascript
运行
复制
dummy <- data.frame(
  x = c(1,2,3,4,5),
  y = c(2,3,4,5,6)
)
dummy 
  x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

如果您只想对数据进行log2转换,那么只需使用如下所示的log(., base = 2)

代码语言:javascript
运行
复制
log(dummy, base = 2)
         x        y
1 0.000000 1.000000
2 1.000000 1.584963
3 1.584963 2.000000
4 2.000000 2.321928
5 2.321928 2.584963

如果你想要log2(x+1)然后是log(dummy+1, base = 2),或者如果你想要log2(x)+1只需要log(dummy, base = 2) + 1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69535558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档