2

我有一张看起来像的桌子

value(0 < v< 1),  # of events
---------------   -----------
0.1,              1000
0.5,              20000
0.7,              3000000
0.1,              400000000
0.5,              50000000000
0.9,              6000000000000
...,              ...

该值可以采用从 0 到 1 的任意数字,可能重复,并且事件的数量如此之大,以至于将其转换为通常形式的向量是低效的,例如

0.1,0,1,...0.1, 0.5,0.5,0.5, ... 

当我尝试将某些功能(例如plot())应用于此表时,R 不会识别具有相同值的行,而是将它们分开处理。用这种表做一些统计数据的好方法是什么,就像我们有下表一样?

value,  # of events
0.1,    400001000
0.5,    ...
4

3 回答 3

5

您的问题有点不清楚,但我认为您只想按每个唯一值对事件求和?如果是这样,那么这个问题和相关问题就有很多答案。这是一种方法:

#fake data
set.seed(1)
x <- data.frame(value = 1:3, events = sample(1:10, 9, TRUE))

#Option 1

 aggregate(events ~ ., data = x, FUN = "sum")
  value events
1     1     23
2     2     14
3     3     22

#Option 2
> tapply(x$events, x$value, FUN = "sum")
 1  2  3 
23 14 22 

#Option 3
> library(plyr)
> ddply(x, "value", summarize, sum = sum(events))
  value sum
1     1  23
2     2  14
3     3  22

#Option 4
> library(data.table)
> x <- data.table(x)
> x[, sum(events), by = value]
     value V1
[1,]     1 23
[2,]     2 14
[3,]     3 22

随着数据的增长,这些解决方案(和其他解决方案)的扩展方式不同。我给出了一个非常全面的答案来比较这里的时间和方法

于 2012-09-08T19:00:04.783 回答
1

作为第一步,这里是如何将您的第一个表格转换为第二个表格。

构造数据:

dd <- setNames(as.data.frame(matrix(c(0.1,1000,
                                      0.5,20000,
                                      0.7,3000000,
                                      0.1,400000000,
                                      0.5,50000000000,
                                      0.9,6000000000000),
                                    ncol=2,byrow=TRUE)),
                             c("value","count"))

用于tapply压缩数据

dd2 <- tapply(dd$count,dd$value,sum)

然后用于melt将数据转换为(可能)更有用的格式:

library(reshape2)
(dd3 <- melt(dd2,varnames="value",value.name="count"))
##   value        count
## 1   0.1 4.000010e+08
## 2   0.5 5.000002e+10
## 3   0.7 3.000000e+06
## 4   0.9 6.000000e+12

添加非常小和非常大的数字时,您可能需要小心。

对于“我应该做什么样的统计?” 问题的一部分——抱歉,这太含糊了。你想知道什么......???

于 2012-09-08T18:56:00.007 回答
1

如果你想要一个加权平均值:

 weighted.mean(dd$value, dd$count)
[1] 0.8966414

加权中位数:(Hmisc 中还有其他几个“加权”函数)

 library(Hmisc)
 wtd.quantile(dd$value, dd$count, .5)
#50% 
#0.9 

绘制只是使用barplot

 barplot(dd$count)  #perhaps with log="y"
 barplot(dd$count, log="y")
于 2012-09-08T21:45:55.977 回答