如何将这些零值子集化?

时间:2012-12-11 11:45:40

标签: r

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

2 个答案:

答案 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