我是R的新手,我得到了一些像vec <- c(1,5,0,6,9,10,20,0,6)
这样的向量,我想对它们应用log()
函数但是
不希望结果中保留值-Inf
。如何通过子集中的值“0”来避免这种情况
原始载体?
答案 0 :(得分: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
答案 1 :(得分: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