很抱歉,如果这是一个基本问题。一直在试图解决这个问题,但却无法做到。 我有一个名为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这样的因素。
由于
答案 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()
将右端打开。