我有这段代码:
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。
答案 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