2017-02-10 3 views
1

私は各グループの上位2行を合計したいデータフレームを持っていますが、その2つのエントリのうちの1つがゼロである場合、値。また、ゼロ以外の値がない場合、sum = 0にするだけです。ソートできないのでオプションではありません。私が持っているもの条件付きで各グループの最初の2行を合計する

...私が欲しいもの

ID | Prod1 
---|------ 
A | 2 
A | 5 
A | 9 
B | 3 
B | 0 
B | 0 
B | 8 
B | 10 
C | 0 
C | 12 
C | 0 
C | 0 

...

ID | Prod1 
---|------ 
A | 7 
B | 11 
C | 0 

DATA

dput(df) 
structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    Prod1 = c(2L, 5L, 9L, 3L, 0L, 0L, 8L, 10L, 0L, 12L, 0L, 0L 
    )), .Names = c("ID", "Prod1"), class = "data.frame", row.names = c(NA, 
-12L)) 

答えて

2

ここではaggregateを用いてベースR方式です。

dfAgg <- aggregate(Prod1~ID, data=df, function(i) sum(i[i != 0][1:2])) 

ここで、sumにはi[i != 0][1:2]の最初の2つの非ゼロ要素が入力されます。最初の[は、iを0以外の要素(i != 0で定義)にサブセットし、次に2番目のは、最初の2つの要素を取ります(1:2で定義)。

function(i)をこのように使用すると、無名関数と呼ばれます(これはPython関数プログラミングでラムダ関数と呼ばれます)。これは、渡す際に使用する機能であり、名前を付けたくありません。すべての要素が0の場合、sumはNAを返します。この行は、今

dfAgg 
    ID Prod1 
1 A  7 
2 B 11 
3 C NA 

を返すと、NAS

dfAgg$Prod1[is.na(dfAgg$Prod1)] <- 0 

dfAgg 
    ID Prod1 
1 A  7 
2 B 11 
3 C  0 
+1

ニースに埋めます。私はその方法がすべての条件を満たすと思っていませんでしたし、私はグループCのためにこのようにそれを行うために私は書いた "汚い"機能を行うために12を得ていた:) – Sotos

+1

うん。私は 'sum'でna.rm = TRUEを使ってみましたが、最終出力では12を得ました。私は、Rが、デフォルトで生成されるNAの代わりに、cグループのi [!= 0] [1:2]のNAを0で置き換えることを意味すると思います。 – lmo

+0

これは完全に機能しました!どうもありがとうございます。私は集計関数をよく知っていますが、関数(i)sum(i [i!= 0] [1:2])のコードではどういう意味ですか? (i [i!= 0] [1:2])私があなたの変数である関数を与えることを言っているだけです。私が0に等しくないことを意味することを理解しています。また、2つの項目の合計を1行に入れたいのであれば、関数はsum(i [1:2])ですか? – PVic

関連する問題