如何在R中记录(x + 1)个 Dataframe 或矩阵

a14dhokn  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(104)

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

laximzn5

laximzn51#

例如dummy数据

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)

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

egmofgnx

egmofgnx2#

Park's answer给出了一个最简单的方法来记录转换一个只有数字的 Dataframe ,但是log(x+1, base = b)是一个不同的问题。

log(x + 1)

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

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

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

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

k97glaaz

k97glaaz3#

另一个解决方案(添加一个非数字列作为“奖励”-以防有人遇到这个问题-)可以是:

dummy <- data.frame(
     x = c(1,2,3,4,5),
     y = c(2,3,4,5,6),
     text = rep("tt", 5))

str(dummy)
'data.frame':   5 obs. of  3 variables:
 $ x   : num  1 2 3 4 5
 $ y   : num  2 3 4 5 6
 $ text: chr  "tt" "tt" "tt" "tt" ...

#save which columns are numeric
idx <- sapply(dummy, is.numeric)

dummy[, idx] <- log2(dummy[, idx] + 1)

str(dummy)
'data.frame':   5 obs. of  3 variables:
 $ x   : num  1 1.58 2 2.32 2.58
 $ y   : num  1.58 2 2.32 2.58 2.81
 $ text: chr  "tt" "tt" "tt" "tt" ...

字符串

相关问题