2

全て、

私が働いている会社は、このデータを使用して私にくれました。つまり、企業を横断単位とし、時間単位を会計年度としたTSCSデータです。各企業にはさまざまなアカウントがあります。特定の会社の各アカウントに費やされた合計金額を作成することに興味があります。

以下のデータの簡単な図を提供できます。関心firmのある断面単位とします。それぞれfirmが会社がお金を使うさまざまなアカウントを持っています。すべての企業に共通のアカウントもあれば、固有のアカウントもあります。特定の年にすべてfirmの人が口座にお金を使ったわけではありません。実際、データの後半までアカウントに適格でなかったものもあれば、脱落したものもあります (そのため、パネル データはバランスが取れていないと見なすことができます)。そのため、提供されたデータの NA は 0 として扱われる可能性がありますが、少し問題があります。一部の企業は、特定の年に資格がありますが、口座にお金を受け取りません。他の企業は、中退または遅刻のために不適格です。

データはこんな感じで、ワイドフォーマットで渡されました。イラスト用の簡易版です。この図でfirm=Bは、1990 年度にアカウントの資格がなくfirm=C、1992 年度にドロップアウトします。

firm   account   FY1990 FY1991 FY1992
A     Account 1    500    900   1000
A     Account 2     30     40     40
A     Account 3     NA     60     20
A     Account 4     NA     35     NA
B     Account 1     NA    340     60
B     Account 2     NA    500    800
B     Account 3     NA    800     NA
B     Account 4     NA     60   1000
C     Account 1   1000    400     NA
C     Account 5    500     60     NA
C     Account 8     60   1000     NA
D     Account 1    400    400    400
D     Account 2     NA   1000   1000
D     Account 3    300     40    300
D     Account 6     NA    300    300
D     Account 7    900    900   1000
D     Account 8   1000   1200   1500

私がやりたい(そしてそうするように言われた)のは、このデータを次のように修正することでした:

firm   account   FY1990 FY1991 FY1992
A     Account 1    500    900   1000
A     Account 2     30     40     40
A     Account 3     NA     60     20
A     Account 4     NA     35     NA
A      TOTAL       530   1035   1060
B     Account 1     NA    340     60
B     Account 2     NA    500    800
B     Account 3     NA    800     NA
B     Account 4     NA     60   1000
B      TOTAL        NA   1700   1860
C     Account 1   1000    400     NA
C     Account 5    500     60     NA
C     Account 8     60   1000     NA
C      TOTAL      1560   1460     NA
D     Account 1    400    400    400
D     Account 2     NA   1000   1000
D     Account 3    300     40    300
D     Account 6     NA    300    300
D     Account 7    900    900   1000
D     Account 8   1000   1200   1500
D      TOTAL      2600   3840   4500

これは、Excel やその他のスプレッドシート プログラムでも同じように簡単に行うことができますが、それは面倒であり、R を使用してこれをプログラムする場合よりも多くの人的エラーを招きます。特定の会社のすべてのアカウントの下に行を追加しようとするのではなく、合計で新しいデータ フレームを作成することに反対しているわけではありません。特定の会計年度のアカウントに不適格な特定の会社の合計に 0 を入れる方が簡単かもしれません。私はいつでもいくつかのゼロを次の NA として再コーディングし、そのプロセスも自動化できます。

これにはループが必要だと思いますが、私は R プログラミングの初心者です。任意の入力をいただければ幸いです。

この図の再現可能なコードは次のとおりです。

firm <- c("A","A","A","A","B","B","B","B","C","C","C","D","D","D","D","D","D")
account <- c("Account 1","Account 2","Account 3","Account 4","Account 1","Account 2","Account 3","Account 4","Account 1","Account 5","Account 8","Account 1","Account 2","Account 3","Account 6","Account 7","Account 8")
FY1990 <- c(500,30,NA,NA,NA,NA,NA,NA,1000,500,60,400,NA,300,NA,900,1000)
FY1991 <- c(900,40,60,35,340,500,800,60,400,60,1000,400,1000,40,300,900,1200)
FY1992 <- c(1000,40,20,NA,60,800,NA,1000,NA,NA,NA,400,1000,300,300,1000,1500)

Data=data.frame(firm=firm, account=account, FY1990=FY1990, FY1991=FY1991, FY1992=FY1992)
summary(Data)
Data
4

2 に答える 2

5

data.tableアプローチは次のとおりです。

library(data.table)
dt <- data.table(Data)

dt[, rbind(.SD,
           c("TOTAL",
             lapply(.SD[, grepl("^FY[0-9]+", names(.SD)), with = F],
                    function(x){sum(x, na.rm = !all(is.na(x)))}
                   )),
           use.names = F),
     by = firm]

これは次のように機能します。企業を反復処理し ( by = firm)、各企業についてスタックします ( rbind)...

  • その会社に関連付けられたデータのサブセット ( .SD) を
  • で始まるベクトル"TOTAL"で、残りはその長いlapply呼び出しによって作成されます。

lapply、一度に 1 つの企業に関連付けられたデータのみを操作します。このデータは.SD、上記の特別な一時的な data.table に格納されます。列名に直接名前を付けることもできます (ただし、この例にはありません)。

呼び出しは次のように機能します。ベクトルのリスト (正規表現テストlapplyに合格した名前を持つ列を選択することによって選択されます) を反復し、各ベクトルに対して関数の特別なバリアントを適用します。greplsum

sum 関数のこのバリアントは、完全なベクトルを調べますx。繰り返しますが、このベクトルは反復処理中のリストから選択され、一度に 1 つの企業に関連付けられた行のみを持ちNAます。x(つまり、場合!all(is.na(x)))。存在する場合、それらのエントリは、任意NAの s をゼロとして処理して合計されます (以降na.rm=TRUE)。そうでない場合は、戻りますNA( sna.rm=FALSEがあるためNA)。

na.rm引数の詳細については、 を参照してください?sum。同様に、上記の関数 ( grepl、 、...) の詳細は、またはlapplyで検索して見つけることができます。?term?"term"

次に、by=firmオプションは企業の結果を積み上げ、最初の列として「企業」を追加します。

結果は次のとおりです。

    firm   account FY1990 FY1991 FY1992
 1:    A Account 1    500    900   1000
 2:    A Account 2     30     40     40
 3:    A Account 3     NA     60     20
 4:    A Account 4     NA     35     NA
 5:    A     TOTAL    530   1035   1060
 6:    B Account 1     NA    340     60
 7:    B Account 2     NA    500    800
 8:    B Account 3     NA    800     NA
 9:    B Account 4     NA     60   1000
10:    B     TOTAL     NA   1700   1860
11:    C Account 1   1000    400     NA
12:    C Account 5    500     60     NA
13:    C Account 8     60   1000     NA
14:    C     TOTAL   1560   1460     NA
15:    D Account 1    400    400    400
16:    D Account 2     NA   1000   1000
17:    D Account 3    300     40    300
18:    D Account 6     NA    300    300
19:    D Account 7    900    900   1000
20:    D Account 8   1000   1200   1500
21:    D     TOTAL   2600   3840   4500
    firm   account FY1990 FY1991 FY1992

data.table最初にパッケージをインストールしてロードする必要があります。

于 2013-05-20T17:58:38.423 に答える
2

あなたがそれをやりたいなら、ちょうど別のオプションdata.frame

require(plyr)

sumNA <- function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE))

res <- rbind(Data,
             ddply(within(Data, account <- "TOTAL"), .(firm, account), 
                           numcolwise(sumNA))
             )


(res <- res[order(res$firm), ])

##    firm   account FY1990 FY1991 FY1992
## 1     A Account 1    500    900   1000
## 2     A Account 2     30     40     40
## 3     A Account 3     NA     60     20
## 4     A Account 4     NA     35     NA
## 18    A     TOTAL    530   1035   1060
## 5     B Account 1     NA    340     60
## 6     B Account 2     NA    500    800
## 7     B Account 3     NA    800     NA
## 8     B Account 4     NA     60   1000
## 19    B     TOTAL     NA   1700   1860
## 9     C Account 1   1000    400     NA
## 10    C Account 5    500     60     NA
## 11    C Account 8     60   1000     NA
## 20    C     TOTAL   1560   1460     NA
## 12    D Account 1    400    400    400
## 13    D Account 2     NA   1000   1000
## 14    D Account 3    300     40    300
## 15    D Account 6     NA    300    300
## 16    D Account 7    900    900   1000
## 17    D Account 8   1000   1200   1500
## 21    D     TOTAL   2600   3840   4500
于 2013-05-20T18:43:41.383 に答える