如果函数遇到0,则在R中不执行任何操作

时间:2018-01-08 02:05:54

标签: r

我有这段代码:

df[, -1] = apply(df[, -1], 2, function(x){x * log(x)})

df看起来像:

sample a b  c
a2     2 1  2
a3     3 0 45

我遇到的问题是df中的某些值为0.您无法使用ln(0)。所以我想告诉我的程序如果尝试取ln(0)就吐出0。

2 个答案:

答案 0 :(得分:2)

您可以在此处使用ifelse

df[,-1] = apply(df[,-1], 2, function(x){ ifelse(x != 0, x*log(x), 0) })

答案 1 :(得分:0)

您可以利用floating point error将少于浮点误差的数量添加到x。由于log(0.00000000000000...0000223)0.0000...,因此输入0即可。其他数字的结果只会以小于浮点误差的数量进行更改,这实际上并非完全没有意义。

避免迭代并将.Machine$double.xmin用于非常非常小的数字

df <- data.frame(sample = c("a2", "a3"), 
                 a = 2:3, 
                 b = c(1L, 0L), 
                 c = c(2L, 45L))

df
#>   sample a b  c
#> 1     a2 2 1  2
#> 2     a3 3 0 45

df[-1] <- df[-1] * log(df[-1] + .Machine$double.xmin)

df
#>   sample        a b          c
#> 1     a2 1.386294 0   1.386294
#> 2     a3 3.295837 0 171.299812

要检查结果,请使用其他方法,将0值更改为1,以便它们返回0:

df2 <- data.frame(sample = c("a2", "a3"), 
                 a = 2:3, 
                 b = c(1L, 0), 
                 c = c(2L, 45L))

df2[df2 == 0] <- 1
df2[-1] <- df2[-1] * log(df2[-1])

df2
#>   sample        a b          c
#> 1     a2 1.386294 0   1.386294
#> 2     a3 3.295837 0 171.299812

因为更改小于浮点错误,结果根据R:

是相同的
identical(df, df2)
#> [1] TRUE