1

次のようなデータセットがあります。多くのクラスがあり、それぞれに多くの (5-10) サブクラスがあり、それぞれに値が関連付けられています。

> data.frame(class=rep(letters[1:4], each=4), subclass=c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8), value=1:16)
   class subclass value
1      a        1     1
2      a        1     2
3      a        2     3
4      a        2     4
5      b        3     5
6      b        3     6
7      b        4     7
8      b        4     8
9      c        5     9
10     c        5    10
11     c        6    11
12     c        6    12
13     d        7    13
14     d        7    14
15     d        8    15
16     d        8    16

最初に各クラス/サブクラスの値を合計し、次にすべてのサブクラスの中で各クラスの中央値を取得します。

つまり、中間ステップは各クラスの各サブクラスの値を合計し、次のようになります (この中間ステップからのデータを保持する必要がないことに注意してください)。

> data.frame(class=rep(letters[1:4], each=2), subclass=1:8, sum=c(3,7,11,15,19,23,27,31))
  class subclass   sum
1     a        1     3
2     a        2     7
3     b        3    11
4     b        4    15
5     c        5    19
6     c        6    23
7     d        7    27
8     d        8    31

2 番目のステップでは、すべてのサブクラスの中で各クラスの中央値を取得し、次のようになります。

> data.frame(class=letters[1:4], median=c(median(c(3,7)), median(c(11,15)), median(c(19,23)), median(c(27,31))))
  class median
1     a      5
2     b     13
3     c     21
4     d     29

これは私が保持する必要がある唯一のデータです。$class と $subclass の両方が因子変数になり、value は常に欠損のない正の整数になることに注意してください。各クラスには、さまざまな数のサブクラスがあります。

厄介な for ループを使用してこれを実行できると確信していますが、ベクトル化され、保守が容易なより良い方法を望んでいました。

4

3 に答える 3

3

別の使用例を次に示します。aggregate

temp <- aggregate(df$value,list(class=df$class,subclass=df$subclass),sum)

aggregate(temp$x,list(class=temp$class),median)

出力:

      class  x
  1     a    5
  2     b   13
  3     c   21
  4     d   29

または、ワンライナーのソリューションが好きな場合は、次のことができます。

aggregate(value ~ class, median, data=aggregate(value ~ ., sum, data=df))
于 2013-03-02T19:35:10.473 に答える
2

あなたはあなたの最初のステップを試すことができます:

df_sums <- aggregate(value ~ class + subclass, sum, data=df)

それで:

aggregate(value ~ class, median, data=df_sums)
于 2013-03-02T19:22:10.130 に答える
2

他に 2 つの選択肢があります。

1 つ目は、集計データを追加した後、ソースを段階的に削減するステートメントave内での使用です。これにより多くの行が繰り返されるため、最後のステップとして安全に使用して、必要な出力を取得できます。withindata.frameunique

unique(within(mydf, {
  Sum <- ave(value, class, subclass, FUN = sum)
  rm(subclass, value)
  Median <- ave(Sum, class, FUN = median)
  rm(Sum)
}))
#    class Median
# 1      a      5
# 5      b     13
# 9      c     21
# 13     d     29

2 番目のオプションは、「data.table」パッケージを使用して、以下のようにステートメントを「複合」することです。ユーザーが名前を指定しない場合V1に自動的に作成される名前です。data.table

library(data.table)
DT <- data.table(mydf)
DT[, sum(value), by = c("class", "subclass")][, median(V1), by = "class"]
#    class V1
# 1:     a  5
# 2:     b 13
# 3:     c 21
# 4:     d 29
于 2013-03-03T15:48:00.203 に答える