2016-07-24 9 views
0

以下の2つの異なる要素にネストされた3つの列のカウントデータを使用して、以下の形式の大きなデータフレームをdという形式で使用しています。多くの列の行を集計します

elevation distance sp1 sp2 spn 
1500 0 2 2 5 
1500 0 2 1 5 
1500 50 2 2 5 
1500 50 2 2 6 
2000 0 9 2 5 
2000 0 7 2 2 
2000 50 4 3 6 
2000 50 4 3 4 

ファクタd$distanceの各レベルに2つの複製行があることに注意してください。

私はそれらがそれはこのように終わるので、各列に加算することによって、各標高内の各距離のレベルのための行を複製集約したいと思います:

elevation distance sp1 sp2 spn 
1500 0 4 3 10 
1500 50 4 4 11 
2000 0 16 4 7 
2000 50 8 6 10 

私は1つのカラム、例えばのためにそれを容易に行うことができますsp1
d2 <-data.frame(aggregate(sp1 ~ elevation + distance, data = d, sum))

は、私はすべての列spsp2spnを含ん同じ形式で新しいデータフレームを取得するためにforループを避けることはできますか?私がオンラインで見たさまざまな解決策を試してみると、私の脳の特定の部分が欠落しているため、失敗に終わりました。ありがとう。

+0

[Rで素晴らしい再現可能な例を作る方法](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – shayaa

+0

@shayaaはそこにいますあなたが答えるのに役立つ何かを私が追加することができますか? – ptenax

答えて

2

summarise_eachdplyrから使用できます。それは速くて効率的です。

library(dplyr) 
df1 %>% 
    group_by(elevation, distance) %>% 
    summarise_each(funs(sum)) 
# elevation distance sp1 sp2 spn 
#  <int> <int> <int> <int> <int> 
#1  1500  0  4  3 10 
#2  1500  50  4  4 11 
#3  2000  0 16  4  7 
#4  2000  50  8  6 10 

は、あるいは、別のオプションは、~の右辺に指定されたものを除くすべての列を指定する.を使用することですaggregateとなりdata.table

library(data.table) 
setDT(df1)[, lapply(.SD, sum) , by = .(elevation, distance)] 

base Rアプローチです。しかし、大規模なデータセットでは、これは遅くなります。

aggregate(.~elevation+distance, df1, sum) 
# elevation distance sp1 sp2 spn 
#1  1500  0 4 3 10 
#2  2000  0 16 4 7 
#3  1500  50 4 4 11 
#4  2000  50 8 6 10 

注:sumからna.rm = TRUEを使用し、NA値がある場合。

user2100721が提案@として、我々はまた、by

base Rから
by(df1[3:5], df1[1:2], FUN = colSums) 

を使用することができます出力はlistになり、list要素をINGのrbindにより行列に変換することができます。

+0

ありがとう、非常にエレガントなソリューション、とすぐに。 「ベースR」はうまくいった。 'dpylr'の解決策がうまくいかず、エラーが発生しました:'エラー: 'sum 'は要因に意味がありません。とてもありがたい。 – ptenax

+0

akrunのデータがあなたと同じではないためです。 – shayaa

+0

@ptenax私はあなたの 'sp1'、 'sp2'、 'spn'列は '数値'だと思いました。あなたは 'str(df1)'を調べることができますか? 'factor'クラスの列があります。 1つの方法は、数値に変換し、次に合計を行うことです。 – akrun

関連する問題