2017-03-01 77 views
2

我有一系列的R,我用cut(例如,说0和1之间的分数值,分解为0.1箱:在水平内计数值

> frac <- cut(c(0, 1), breaks=10) 
> levels(frac) 
[1] "(-0.001,0.1]" "(0.1,0.2]" "(0.2,0.3]" "(0.3,0.4]" "(0.4,0.5]" 
[6] "(0.5,0.6]" "(0.6,0.7]" "(0.7,0.8]" "(0.8,0.9]" "(0.9,1]" 

鉴于含[0.0, 1.0]之间连续值的向量v,我如何计数元件在v落在levels(frac)每个级别内的频率是多少?

我可以自定义休息的次数和/或我制作关卡的时间间隔,所以我正在寻找一种方法来使用标准R命令执行此操作,以便可以构建两列数据帧:作为因素的级别一列,第二列为v以上级别的总元素的小数或百分比值。

注:以下不工作:

> table(frac) 
frac 
(-0.001,0.1] (0.1,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] (0.5,0.6] 
      1   0   0   0   0   0 
    (0.6,0.7] (0.7,0.8] (0.8,0.9]  (0.9,1] 
      0   0   0   1 

如果我使用cutv直接,那么我不,当我在不同的载体上运行cut得到相同的水平,因为值的范围 - 他们的最小值和最大值 - 在任意矢量之间会有所不同,所以虽然我可能有相同数量的中断,但是间隔时间不会相同。

我的目标是采取不同的载体,并将它们放入同一组水平。希望这有助于澄清我的问题。感谢您的帮助。

+0

投票关闭此没有解释为什么有些被动进取的垃圾。我在这里已经很多年了,我不能相信这需要说,但是:把它关掉。 –

回答

0
frac = seq(0,1,by=0.1) 

ranges = paste(head(frac,-1), frac[-1], sep=" - ") 
freq = hist(v, breaks=frac, include.lowest=TRUE, plot=FALSE) 

data.frame(range = ranges, frequency = freq$counts) 
+2

这是实现这一目标的极其迂回的方式。 –

+1

谢谢,这让我回到了一个我可以直接使用的向量。 –

+2

@AlexReynolds不要娇生惯养,但你已经接受了这三者中最容易出错的答案。 –

2

修改frac实际上代表所需的间隔,然后使用table功能:

x = runif(100) # For example. 
frac = cut(x, breaks = seq(0, 1, 0.1)) 
table(frac) 

结果:

frac 
    (0,0.1] (0.1,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] (0.5,0.6] (0.6,0.7] (0.7,0.8] 
     14   9   8  10   8  12   7   7 
(0.8,0.9] (0.9,1] 
     16   9 
+3

这并没有给我正确的答案。 –

+2

为了更具体一些,我想计算一组给定级别的任意向量。这并不是那样做的。 –

+0

@AlexReynolds立即查看。我已经解决了我的答案。我一味地认为间隔是正确的......但他们没有。请注意您在最左侧获得的负值。 –

1

使用findInterval而不是切:

v<-data.frame(v=runif(100,0,1)) 

library(plyr) 
v$x<-findInterval(v$v,seq(0,1,by=0.1))*0.1 
ddply(v, .(x), summarize, n=length(x)) 
1
frac = seq(0, 1, 0.1) 
set.seed(42); v = rnorm(10, 0.5, 0.2) 
sapply(1:(length(frac)-1), function(i) sum(frac[i]<v & frac[i+1]>=v)) 
#[1] 0 0 0 1 3 2 1 1 1 1 
+1

谢谢,这个工作也很好。不确定谁投票的事情。 –

2

介绍极端c(0, 1)v然后用同样的cut

library(dplyr) 

#dummy data 
set.seed(1) 
v <- round(runif(7), 2) 

#result 
data.frame(v, 
      vFrac = cut(c(0, 1, v), breaks = 10)[-c(1, 2)]) %>% 
    group_by(vFrac) %>% 
    mutate(vFreq = n()) 

# Source: local data frame [10 x 3] 
# Groups: vFrac [8] 
# 
#  v  vFrac vFreq 
# <dbl>  <fctr> <int> 
# 1 0.27 (0.2,0.3]  1 
# 2 0.37 (0.3,0.4]  1 
# 3 0.57 (0.5,0.6]  1 
# 4 0.91  (0.9,1]  2 
# 5 0.20 (0.1,0.2]  1 
# 6 0.90 (0.8,0.9]  1 
# 7 0.94  (0.9,1]  2 
+0

如果明确指定中断,则不需要引入极端值,或者除去后面的任何内容。 –

+0

@KonradRudolph同意,只是试图遵循OP的逻辑,重新使用来自其他因素对象的因素水平(不知道这是否有意义)。 – zx8754