24

次のようなサンプルデータフレーム「データ」があります。

X            Y  Month   Year    income
2281205 228120  3   2011    1000
2281212 228121  9   2010    1100
2281213 228121  12  2010    900
2281214 228121  3   2011    9000
2281222 228122  6   2010    1111
2281223 228122  9   2010    3000
2281224 228122  12  2010    1889
2281225 228122  3   2011    778
2281243 228124  12  2010    1111
2281244 228124  3   2011    200
2281282 228128  9   2010    7889
2281283 228128  12  2010    2900
2281284 228128  3   2011    3400
2281302 228130  9   2010    1200
2281303 228130  12  2010    2000
2281304 228130  3   2011    1900
2281352 228135  9   2010    2300
2281353 228135  12  2010    1333
2281354 228135  3   2011    2340

Y ごとに 4 つの観測値がある場合 (たとえば、2010 年の 6、9、12 月と 2011 年の 3 月の 2281223 の場合)を使用して、各( ではなく)ddplyの収入を計算したいと考えています。観測値が 4 つ未満の場合 (たとえば Y =228130 の場合)、単純に無視したいと思います。上記の目的で次のコマンドを使用します。YXR

require(plyr)
     # the data are in the data csv file
    data<-read.csv("data.csv")
    # convert Y (integers) into factors
    y<-as.factor(y)
    # get the count of each unique Y
    count<-ddply(data,.(Y), summarize, freq=length(Y))
    # get the sum of each unique Y 
    sum<-ddply(data,.(Y),summarize,tot=sum(income))
    # show the sum if number of observations for each Y is less than 4
    colbind<-cbind(count,sum)
    finalsum<-subset(colbind,freq>3)

私の出力は次のとおりです。

>colbind
       Y freq      Y   tot
1 228120    1 228120  1000
2 228121    3 228121 11000
3 228122    4 228122  6778
4 228124    2 228124  1311
5 228128    3 228128 14189
6 228130    3 228130  5100
7 228135    3 228135  5973
>finalsum
       Y freq    Y.1  tot
3 228122    4 228122 6778

上記のコードは機能しますが、多くの手順が必要です。それで、上記のタスクを実行する簡単な方法があるかどうかを知りたいです(plyrパッケージを使用)。

4

2 に答える 2

34

コメントで指摘されているように、 内で複数の操作を実行できますsummarize

これにより、コードが 1 行と 1 行のサブセットに削減されます。これは、演算子ddply()を使用すると十分に簡単です。[

x <- ddply(data, .(Y), summarize, freq=length(Y), tot=sum(income))
x[x$freq > 3, ]

       Y freq  tot
3 228122    4 6778

これも、data.tableパッケージを使用すると非常に簡単です。

library(data.table)
data.table(data)[, list(freq=length(income), tot=sum(income)), by=Y][freq > 3]
        Y freq  tot
1: 228122    4 6778

実際、ベクトルの長さを計算する操作には独自のショートカットがありdata.tableます - ショートカットを使用して.Nください:

data.table(data)[, list(freq=.N, tot=sum(income)), by=Y][freq > 3]
        Y freq  tot
1: 228122    4 6778
于 2012-12-26T04:16:39.447 に答える