2017-03-01 20 views
2

나는 cut으로 생성하는 R 레벨 집합을 가지고 있습니다. 0.1 빈들로 세분화 0과 1 사이의 분수 값을 말한다 :레벨 내의 카운팅 값

[0.0, 1.0] 사이의 연속 값을 포함하는 벡터 v, 어떻게 levels(frac) 각 레벨 내에 v 요소의 주파수 세는 주어
> 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]" 

?

레벨을 만들 때 휴식 시간 및/또는 간격을 사용자 정의 할 수 있으므로 표준 R 명령으로이 작업을 수행하는 방법을 찾고 있으므로 2 열 데이터 프레임을 작성할 수 있습니다 : 레벨에 대해 하나의 열을 요소로 사용하고 두 번째 열은 전체 요소의 분수 또는 백분율 값에 대해 레벨 이상으로 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 

내가 다른 벡터에 cut을 실행할 때 직접, 나는이 같은 수준을하지 않는 vcut를 사용하는 경우, 값의 범위 때문에 - 자신의 최소값과 최대 값은 임의의 벡터 사이에서 달라 지므로 동일한 수의 브레이크가있을 수 있지만 레벨 간격은 동일하지 않습니다.

내 목표는 다른 벡터를 가져 와서 같은 레벨 집합에 저장하는 것입니다. 바라기를 이것은 내 질문을 분명히하는 데 도움이됩니다. 도움을 주셔서 감사합니다.

+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 부끄러워하지 말아라. 그러나 당신은 여기의 3 개의 가장 쉬운 대답을 받아 들였다. –

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