如何在R中采用具有负值的矩阵的Log2

时间:2016-04-18 10:44:19

标签: r transformation boxplot

我有一个有三列的矩阵,值有很多变化,从大正值到0到大负值。为了更好地表示数据,我想获取所有值的log2,但由于无法取负值的log2和0,我想做以下事项:

  1. 如果number = 0,则将其更改为1并采用log2
  2. 如果数字< 0然后取绝对值的log2并为其指定负数
  3. 如果数字> 0然后取数字的log2
  4. 我尝试使用以下代码执行此操作但到目前为止没有成功:

    Log2Transformed <- ifelse(df == 0, 1, log2(df) & ifelse(df < 0, -log2(abs(df)), log2(df)))
    
    head(df)
         Open_TD Close_TD Invariant_TD
    [1,]       1        6            5
    [2,]       2        2            4
    [3,]       0        0           -1
    [4,]       0        0            2
    [5,]       NA       0            2
    [6,]       NA       0            1
    

3 个答案:

答案 0 :(得分:3)

另一种方法是使用$ sign $函数,你需要在单独的步骤中替换它,例如。

test <- rnorm(100)
abs_log <- function(x){
  x[x==0] <- 1
  si <- sign(x)
  si * log2(si*x)
}

boxplot(abs_log(test))

答案 1 :(得分:2)

这可能是一种聪明的方法,但我会花时间更清楚地定义每一步。

## Create dummy data
dd = data.frame(x = c(0, rnorm(100)))

首先为转换后的数据创建一列

dd$trans = dd$x

然后按照规则逐步操纵列

#If number = 0 then change it to 1 and take log2
dd$trans[dd$x==0] = log2(1)
#If number < 0 then take log2 of absolute value 
# and assign the negative number to it
dd$trans[dd$x< 0] = -log2(abs(dd$x[dd$x <0]))
#If number > 0 then take log2 of the number
dd$trans[dd$x> 0] = log2(dd$x[dd$x >0])

在绘图之前

boxplot(dd$trans)

我会创建一个名为trans_log2的函数,它会自动执行此操作,例如

dd$x = trans_log2(dd$x)

答案 2 :(得分:2)

让我们建设性地做到这一点:

如果x > 0我们记录它。

如果x == 0我们将其替换为1,则记录。

如果x < 0我们否定,则记录,然后再次否定。也就是说,如果我们有一个否定的,说x= -y, y>0输出应该是-1*log(y),这正是log(1/y)的结果。

因此我们希望将每个否定x替换为1/abs(x),同时不会伤害我们的积极因素。显然abs(x)不会影响积极因素,指示否定值的方式是sign(x)给出的符号。符号取幂只能用它们的倒数代替负数。

总而言之,我们对价值替换的解决方案是(abs(x))^(sign(x)),然后我们可以愉快地log2,所以我们得到:

Log2Transformed <- log2((abs(df))^(sign(df)))

此输入(基于您的示例):

  Open_TD Close_TD Invariant_TD
1     1.0        6            5
2     2.0        2            4
3   -32.0        0           -1
4    -0.5        0            2
5      NA        0            0
6      NA        0            1

我们得到以下输出:

     Open_TD Close_TD Invariant_TD
[1,]       0 2.584963     2.321928
[2,]       1 1.000000     2.000000
[3,]      -5 0.000000     0.000000
[4,]       1 0.000000     1.000000
[5,]      NA 0.000000     0.000000
[6,]      NA 0.000000     0.000000

单行,无需额外功能,无需实际更改原始数据或创建新数据帧,最重要的是使用R和MatLab典型的矩阵脚本。