2014-03-24 6 views
0

값이있는 데이터 프레임이 있으며 각 값에 대해 해당 값과 관련된 개수가 있습니다. 따라서 값에 대해 카운트를 플로팅하면 히스토그램이 나옵니다. 나는 a, bc의 세 가지 유형이 있습니다.히스토그램에서 얻은 값은 cdf로 계산됩니다.

   value counts  type 
        0 139648267 a 
        1 34945930 a 
        2 5396163 a 
        3 1400683 a 
        4 485924 a 
        5 204631 a 
        6  98599 a 
        7  53056 a 
        8  30929 a 
        9  19556 a 
        10  12873 a 
        11  8780 a 
        12  6200 a 
        13  4525 a 
        14  3267 a 
        15  2489 a 
        16  1943 a 
        17  1588 a 
       ...  ... ... 

어떻게 이것을 CDF로 가져 옵니까?

지금까지 나의 접근 방식은 매우 비효율적이다 :

get_cumulative <- function(x) { 
    result <- numeric(nrow(x)) 
    for (i in seq_along(result)) { 
    result[i] = sum(x[x$num_groups <= x$num_groups[i], ]$count) 
    } 
    x$cumulative <- result 
    x 
} 

가 그럼 난 종류에 따라 분할하는 ddply이 포장 : 내가 처음 그 값까지의 수를 요약 함수를 작성. 이것은 분명히 최선의 방법은 아니며 진행 방법에 대한 제안을 듣고 싶습니다. 데이터가 data.frame DF에있는 경우

+1

'cumsum'은 어떻게됩니까? –

답변

3

을해야 다음 (가정 데이터가 df에 있으며 값으로 분류) :

transform(df, cdf=ave(counts, type, FUN=function(x) cumsum(x)/sum(x))) 

다음은 장난감의 예입니다.

df <- data.frame(counts=sample(1:100, 10), type=rep(letters[1:2], each=5)) 
transform(df, cdf=ave(counts, type, FUN=function(x) cumsum(x)/sum(x))) 
생성 617,451,515,

:

counts type  cdf 
1  55 a 0.2750000 
2  61 a 0.5800000 
3  27 a 0.7150000 
4  20 a 0.8150000 
5  37 a 1.0000000 
6  45 b 0.1836735 
7  79 b 0.5061224 
8  12 b 0.5551020 
9  63 b 0.8122449 
10  46 b 1.0000000 
+0

당신은 생명의 은인이고, 나는'expandRows'를하고,'ecdf'를 사용하고 있습니다, 그러나 이것은 훨씬 낫습니다! –

1

다음 avecumsum을 사용할 수 있습니다

do.call(rbind, lapply(split(DF, DF$type), FUN=cumsum))

0

CRAN에 HistogramTools 패키지 히스토그램 및 CDFS 정보 사이의 변환 손실이나 에러 마진을 산출하고,이 기능에 도움을 플롯 여러 기능을 갖는다.

당신이 h 다음 기본 데이터 세트의 실증 CDF를 계산 히스토그램과 같이 간단 경우 :

library(HistogramTools) 
h <- hist(runif(100), plot=FALSE) 
plot(HistToEcdf(h)) 

경우에 R 히스토그램 개체로 휴식과 카운트하여 입력 데이터를 변환하는 최초의 필요성, 먼저 PreBinnedHistogram 기능을 확인하십시오.

관련 문제