2014-03-24 43 views
0

我有一个数据帧在那里我有值,并为每个值我有与该值相关联的计数。所以,根据数值绘制计数值可以得到直方图。我有三种类型,abc从直方图得到计数到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由式分割这个包起来。这显然不是最好的方法,我很乐意提供关于如何继续的建议。

+1

什么'cumsum'? –

回答

3

您可以使用avecumsum(假设你的数据在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))) 

产生:

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

如果你的数据在data.frame DF然后下面应该做

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

0

HistogramTools包上CRAN有几个功能为直方图和CDF的之间进行转换,计算信息丢失或错误页边距,和绘图功能,以帮助与此有关。

如果你有一个直方图h然后计算基础数据集的经验CDF很简单,只要:

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

如果你首先需要休息和计数的输入数据转换成R柱状图对象,然后先看到PreBinnedHistogram函数。