2

私はRを初めて使用し、ループについて質問があります

私の実際のデータセットには、80 か国の 15 部門と 6 種類の組織で 7000 の観測がありますが、ここでは単純化した例を示します。

country <- c("a","a","a","a","a","a","b","b","b","b","b","b",
             "c","c","c","c","c","c","d","d","d","d","d","d")
sector <- c("a","a","a","b","c","c","a","b","b","b","c","c",
            "b","b","b","b","c","c","a","a","b","b","c","c")
organization <-c("a","b","c","c","b","a","a","b","b","c","b","b",
                 "c","a","a","b","b","c","c","b","a","a","b","c")
budget <-c(2,4,3,5,9,7,5,4,3,6,1,2,4,5,6,1,5,3,4,2,3,5,4,6)
table <- data.frame(country, sector, organization, budget)

私が欲しいのは:

  1. 特定の国における特定のセクターのさまざまな種類の組織の数。
  2. さまざまな種類の組織に与えられたセクターの総予算の割合。

まず、国「a」とセクター「a」からの情報のみを選択するサブセットを作成する必要があります

smalltable <-subset(table, (country == "a") & (sector == "a"))

それから私の最初の質問に答えてください 国の各部門にそれぞれのタイプの組織がいくつありますか

smalltable$count <- table(smalltable$organization)

次に、財政のパーセンテージを見つける必要があります

smalltable$percentage <- smalltable$budget / sum(smalltable$budget)

それから私はtapplyを使いました

 N <- tapply(smalltable$count, smalltable$organization, FUN=sum)
 financialshare <- tapply(smalltable$percentage, smalltable$organization, FUN=sum)    

そして最後にこれを組み合わせました:

 total <- data.frame (smalltable$country,smalltable$sector,smalltable$organization, N,financialshare)
 total

これは私が必要とする小さなテーブルです!

しかし、これは 15 のセクターすべてと 80 か国すべてで必要なので、すべてのセクターのループを実行し、すべての国でこのループを繰り返すある種のループ関数が必要です。1 つの国 (つまり 15 セクター) に関するすべての情報を 1 つのテーブルにまとめて、これらのテーブルを可能な限り凝縮する必要があります。また、スペースを節約するために、テーブルからゼロ値を削​​除する必要があります。

どのように進める必要がありますか?

4

3 に答える 3

3

data.table答えてあげる

library(data.table)
my_table=data.table(country, sector, organization, budget)
by_org=my_table[, list(count=.N, budget=sum(budget)),
                  keyby=list(country, sector, organization)]
total_budgets=my_table[, list(total_budget=sum(budget)),
                  keyby=list(country, sector)]
joined_table= total_budgets[by_org]
joined_table[,percentage:=budget/total_budget]

Matthew からの編集: v1.8.1 では、:=グループごとに使用すると結合が不要になるため、簡単かつ高速になりtotal_budget、v1.8.0 で結合を使用している場所よりも自然な場所である右側に列が追加されます。

DT = data.table(country, sector, organization, budget) 
ans = DT[, list(count=.N, budget=sum(budget)),
           keyby=list(country, sector, organization)] 
ans[, total_budget:=sum(budget), by=list(country,sector)]
ans[, percentage:=budget/total_budget]

結果(v1.8.1を使用):

    country sector organization count budget total_budget percentage
 1:       a      a            a     1      2            9  0.2222222
 2:       a      a            b     1      4            9  0.4444444
 3:       a      a            c     1      3            9  0.3333333
 4:       a      b            c     1      5            5  1.0000000
 5:       a      c            a     1      7           16  0.4375000
 6:       a      c            b     1      9           16  0.5625000
 7:       b      a            a     1      5            5  1.0000000
 8:       b      b            b     2      7           13  0.5384615
 9:       b      b            c     1      6           13  0.4615385
10:       b      c            b     2      3            3  1.0000000
11:       c      b            a     2     11           16  0.6875000
12:       c      b            b     1      1           16  0.0625000
13:       c      b            c     1      4           16  0.2500000
14:       c      c            b     1      5            8  0.6250000
15:       c      c            c     1      3            8  0.3750000
16:       d      a            b     1      2            6  0.3333333
17:       d      a            c     1      4            6  0.6666667
18:       d      b            a     2      8            8  1.0000000
19:       d      c            b     1      4           10  0.4000000
20:       d      c            c     1      6           10  0.6000000

ここで注意すべき点が 2 つあります。まず、カウントと合計に関する限り、あなたの質問は少しあいまいで、実際に何を求めているかについて矛盾していますが、うまくいけば、私のスニペットは、私が行っている計算に関しては自明です。

R第 2 に、多数の観測をループ処理することは遅くなる傾向があるため、慣用的ではありません。Rプログラミングをしばらく行ったことのあるほとんどの人は、ベクトル演算 、 plyrdata.table、または他の同様のパッケージを使用する傾向があります。

しかし、完全にするために、ループの構築は次のとおりです。

for (item in list)
{
    ...
}

共通のインデックスを反復するには...

for (i in 1:length(object))
{
    ...
}
于 2012-06-19T11:58:19.113 に答える
2
library(plyr)
ddply(table,.(country,sector), transform,count=as.vector(table(budget)),percentage=budget / sum(budget))

与える

   country sector organization budget count percentage
1        a      a            a      2     1  0.2222222
2        a      a            b      4     1  0.4444444
3        a      a            c      3     1  0.3333333
4        a      b            c      5     1  1.0000000
5        a      c            b      9     1  0.5625000
6        a      c            a      7     1  0.4375000
7        b      a            a      5     1  1.0000000
8        b      b            b      4     1  0.3076923
9        b      b            b      3     1  0.2307692
10       b      b            c      6     1  0.4615385
11       b      c            b      1     1  0.3333333
12       b      c            b      2     1  0.6666667
13       c      b            c      4     1  0.2500000
14       c      b            a      5     1  0.3125000
15       c      b            a      6     1  0.3750000
16       c      b            b      1     1  0.0625000
17       c      c            b      5     1  0.6250000
18       c      c            c      3     1  0.3750000
19       d      a            c      4     1  0.6666667
20       d      a            b      2     1  0.3333333
21       d      b            a      3     1  0.3750000
22       d      b            a      5     1  0.6250000
23       d      c            b      4     1  0.4000000
24       d      c            c      6     1  0.6000000
于 2012-06-19T11:30:32.057 に答える
1

を使用するためにこれを完全に設定しましたplyr。つまり、1 つのサブセットに対して (ほぼ) 動作し、そのサブセットに必要なものを正確に返すプロセスがあり、可能なすべてのサブセットをループするだけでよいということです。コードを書き直して、コードをよりタイトにし、欠落している可能性のあるorganizations を回避しました。

library("plyr")

ddply(table, .(country, sector), function(smalltable) {
  smalltable <- ddply(smalltable, .(organization), summarise, 
                      count=length(budget), budget=sum(budget))
  smalltable$percentage <- smalltable$budget / sum(smalltable$budget)
  smalltable
})

を与える

   country sector organization count budget percentage
1        a      a            a     1      2  0.2222222
2        a      a            b     1      4  0.4444444
3        a      a            c     1      3  0.3333333
4        a      b            c     1      5  1.0000000
5        a      c            a     1      7  0.4375000
6        a      c            b     1      9  0.5625000
7        b      a            a     1      5  1.0000000
8        b      b            b     2      7  0.5384615
9        b      b            c     1      6  0.4615385
10       b      c            b     2      3  1.0000000
11       c      b            a     2     11  0.6875000
12       c      b            b     1      1  0.0625000
13       c      b            c     1      4  0.2500000
14       c      c            b     1      5  0.6250000
15       c      c            c     1      3  0.3750000
16       d      a            b     1      2  0.3333333
17       d      a            c     1      4  0.6666667
18       d      b            a     2      8  1.0000000
19       d      c            b     1      4  0.4000000
20       d      c            c     1      6  0.6000000

tableこれは基本関数の名前でもあるため、変数の適切な名前ではないことに注意してください。

于 2012-06-19T15:24:20.360 に答える