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

あなたの質問は少し不明確ですが、イベントを一意の値ごとに合計したいだけだと思いますか? もしそうなら、これと関連する質問に対する答えはたくさんあります。1 つのアプローチを次に示します。

#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

加重平均が必要な場合:

 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 に答える
1

最初のステップとして、最初のテーブルを 2 番目のフォームに変換する方法を次に示します。

データを構築します。

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 に答える