在间隔中查找值

时间:2014-05-18 21:50:18

标签: r cut

很抱歉,如果这是一个基本问题。一直在试图解决这个问题,但却无法做到。 我有一个名为sym的值向量。

> head(sym)
         [,1]
val  3.652166e-05
val -2.094026e-05
val  4.583950e-05
val  6.570184e-06
val -1.431486e-05
val -5.339604e-06

这些我通过在sym上使用切割函数因子来进行间隔。

  

factorx< - 因子(切割(符号,断裂= nclass.Sturges(符号)))

 [1] (2.82e-05,5.28e-05]  (-2.11e-05,3.55e-06] (2.82e-05,5.28e-05]  (3.55e-06,2.82e-05]    (-2.11e-05,3.55e-06] (-2.11e-05,3.55e-06] 
[7] (-2.11e-05,3.55e-06] (2.82e-05,5.28e-05]  (3.55e-06,2.82e-05]  (7.74e-05,0.000102] 

Levels: (-2.11e-05,3.55e-06] (3.55e-06,2.82e-05] (2.82e-05,5.28e-05] (7.74e-05,0.000102]

很明显,在factorx中创建了四个区间。现在我有一个新值tmp = 3.7e-0.6。 我的问题是我怎样才能找到它所属的上述区间?我试图使用findInterval()但似乎它不适用于像factorx这样的因素。

由于

1 个答案:

答案 0 :(得分:2)

如果您计划重新分类新值,最好使用向量而不是大小显式设置breaks=参数。如果这些值最初不在集合中,那么您可能会有不同的中断,并且您的新值可能超出现有数据的所有级别,这可能很麻烦。

首先,我将生成一些样本数据。

set.seed(18)
x <- runif(50)

现在我将展示两种不同的计算休息方式。以下是b1()b2()

b1<-function(x, n=nclass.Sturges(x)) {
    #like default cut()
    nb <- as.integer(n + 1)
    dx <- diff(rx <- range(x, na.rm = TRUE))
    if (dx == 0) 
        dx <- abs(rx[1L])
    seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, 
        length.out = nb)
}
b2<-function(x, n=nclass.Sturges(x)) {
    #like default hist()
    pretty(range(x), n=n)
}

因此,这些函数中的每一个都会给出与cut()hist()的默认行为类似的断点。它们每个都返回一个带有明确陈述的所有断点的向量,而不仅仅是一个断点数。这允许您使用cut()创建因子

mybreaks <- b1(x)
factorx <- cut(x,breaks=mybreaks))

(请注意,您不必将cut()包裹在factor()中,因为cut()已经返回一个因子。现在,如果您获得新值,则可以使用{{findInterval()对其进行分类。 1}}和你已经准备的特殊休息矢量

nv <- runif(5)
grp <- findInterval(nv,mybreaks)

我们可以用

检查结果
data.frame(grp=levels(factorx)[grp], x=nv)
#              grp         x
# 1  (0.831,0.969] 0.8769438
# 2 (0.00131,0.14] 0.1188054
# 3  (0.416,0.554] 0.5467373
# 4   (0.14,0.278] 0.2327532
# 5  (0.554,0.693] 0.6022678

一切看起来都不错。在这种情况下,findInterval()将告诉您每个项目所属的先前因素的哪个级别。如果数字小于之前的观察值,它将返回0,但是对于大于mybreaks的最大值的任何值,它将返回最大类别。此行为与返回cut()的{​​{1}}略有不同。 NA中的最后一个组右侧关闭,cut()将右端打开。