我有一个数据框,我有值,每个值我都有与该值相关的计数。因此,根据值绘制计数给出了直方图。我有三种类型,a
,b
和c
。
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
中。这显然不是最好的方式,我喜欢任何有关如何继续的建议。
答案 0 :(得分:3)
您可以使用ave
和cumsum
(假设您的数据位于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
答案 1 :(得分:1)
如果您的数据位于data.frame DF
中,则应执行以下操作
do.call(rbind, lapply(split(DF, DF$type), FUN=cumsum))
答案 2 :(得分:0)
CRAN上的HistogramTools软件包具有多种函数,用于在直方图和CDF之间进行转换,计算信息丢失或错误边距,以及绘制函数以帮助解决此问题。
如果你有直方图h
,那么计算基础数据集的经验CDF就像这样简单:
library(HistogramTools)
h <- hist(runif(100), plot=FALSE)
plot(HistToEcdf(h))
如果您首先需要将中断和计数的输入数据转换为R直方图对象,请先查看PreBinnedHistogram
函数。