0

我是 R 新手,我得到了一些向量,例如vec <- c(1,5,0,6,9,10,20,0,6),我想对log()它们应用一个函数,但不希望-Inf结果中剩余的值。如何通过子集原始向量中的值“0”来避免这种情况?

4

2 回答 2

4

在这种情况下,使用函数应用可能更容易删除它们:log()is.finite()

> vec <- c(1,5,0,6,9,10,20,0,6)
> lvec <- log(vec)
> is.finite(lvec)
[1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
> lvec[is.finite(lvec)]
[1] 0.000000 1.609438 1.791759 2.197225 2.302585 2.995732
[7] 1.791759

请注意,有相反的功能is.infinite()来识别Inf-Inf

> is.infinite(lvec)
[1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE

要执行您想要的操作,您始终可以识别哪些等于(不等于)零并删除(选择)这些元素,如

> log(vec[vec != 0]) # select *not* zero elements
[1] 0.000000 1.609438 1.791759 2.197225 2.302585 2.995732
[7] 1.791759
> log(vec[!vec == 0]) # don't select the zero elements
[1] 0.000000 1.609438 1.791759 2.197225 2.302585 2.995732
[7] 1.791759
于 2012-12-11T11:55:22.880 回答
2
v <- c( 1,5,0,6,9,10,20,0,6)

log(v[v!=0])  # log to all values but 0's
log(v[v>=1])  # log of all non-negative and non-zeroes values log(v[!v<=0])
log(pmax(v, 1)) # all 0's are set to be 1, then applying log
于 2012-12-11T11:57:17.597 回答