1

3 つの列を持つ data.frame があり、それぞれが要因と考えることができます。data.frame でいくつかの統計を計算し、それを新しいフレームに保存したいと思います。より具体的には、次のフィールドがあります。

obs, len, src
A    10   X
B    10   Y

各長さでの各ソースの内訳を計算したいと思います (つまり、長さ 10 のソース X からの観測値の何パーセントが「A」、「B」などであるか)。

これに対する明らかなアプローチは、2 つの for ループを使用して長さとソースを反復処理し、次に nrow() と count() を使用して、計算する必要がある値を取得することです。

relevant_subset <- data[data$src==source & data$len==length,]
breakdown_info <- count(relevant_subset)
breakdown_info$frac <- breakdown_info$freq / nrow(relevant_subset)

double for ループの使用を避け、よりベクトル化されたアプローチを使用する方法はありますか? 長さとソースごとに変更された breakdown_info を保持する新しいフレームを事前に割り当てるスマートな方法はありますか?

4

3 に答える 3

2

aggregateはこれらのタスクの友達です:

サンプルデータ:

set.seed(23)
test <- data.frame(
  obs=sample(LETTERS[1:2],20,replace=TRUE),
  len=sample(c(10,20),20,replace=TRUE),
  src=sample(LETTERS[24:25],20,replace=TRUE)
)

それを集約します。

aggregate(obs ~ src + len,data=test, function(x) prop.table(table(x)))

  src len     obs.A     obs.B
1   X  10 0.6000000 0.4000000
2   Y  10 0.2000000 0.8000000
3   X  20 0.2500000 0.7500000
4   Y  20 0.1666667 0.8333333
于 2013-07-10T00:18:02.273 に答える
1

これがplyrパッケージの目的です!

形式は<input_type><output_type>ply. たとえば、入力が aで、出力をusedata.frameにしたい場合。data.frameddply

これを使用するには、入力、グループ化する列、および各グループからdata.framea を構築する関数を指定します。data.frameグループ化列が追加された結果data.framesは、出力にまとめられますdata.frame

あなたの例に似たもので、あなたはすることができます

require(plyr)
a <- data.frame(
    obs=factor(c('A','A','A','B','B')),
    len=c(10,10,10,10,210),
    src=factor(c('X','X','Y','Y','Z')))

それから

z <- ddply(
  a,
  .(obs),
  function(df){
    data.frame(mean.len=mean(df$len))
  })

生み出すだろう

data.frame(
  obs=c('A', 'B'),
  mean.length(10, 110))

その間

ddply(a, .(src), function(df){
  data.frame(
    num.obs.A = sum(df$obs == 'A'),
    num.obs.B = sum(df$obs == 'B'))})

生み出すだろう

data.frame(
  src=c('X','Y', 'Z'),
  num.obs.A = c(3,1,0),
  num.obs.B = c(0,1,1))  

Web サイトはhttp://plyr.had.co.nz/で、ドキュメントも充実しています。

于 2013-07-10T21:12:28.617 に答える
0

ここで出力として data.frame が必要な理由を述べていません。おそらくそれがあなたにとって最善であるかもしれませんが、そうではないかもしれません。また、どの比率が何であるかについても明確ではありませんが、次の方法で問題を最もよく解決できると思います。

prop.table( table(test) )

比較したいものが最も簡単に調べられるように、少し違った方法で入力し、列の順序をいじることができます。ただし、この出力は 3 次元配列であり、data.frame とはかなり異なります。

(代替使用例)

prop.table(with(test, table(src, obs, len) ))
于 2013-07-10T22:01:03.333 に答える