2016-04-22 17 views
0

言い換えれば、別の列(たとえばlocation)を維持しながら、1つの列(たとえばcolumn)をどのように集計しますか?R&Dplyr:summarize()の後に元のデータフレーム/データテーブルの列を追加する方法は?

このMWEは私の問題を示しています。 summarise()を実行した後、location列にどのように追加すればよいですか? summarise()の前に、元の列を維持できるように、「レベルアップ」を含む解決策がありますか?

test <- as.data.table(data.frame(event_id = c("A","B","A","A","B"), 
           income = c(1,2,3,4,5), 
           location = c("PlaceX","PlaceY","PlaceX","PlaceX","PlaceY"))) 

test 

    event_id income location 
1:  A  1 PlaceX 
2:  B  2 PlaceY 
3:  A  3 PlaceX 
4:  A  4 PlaceX 
5:  B  5 PlaceY 

test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income)) 

Source: local data table [2 x 2] 

    event_id mean_inc 
    (fctr) (dbl) 
1  A 2.666667 
2  B 3.500000 

次は動作しません:

test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income), 
    location = location) 

Source: local data table [5 x 3] 

    event_id mean_inc location 
    (fctr) (dbl) (fctr) 
1  A 2.666667 PlaceX 
2  A 2.666667 PlaceX 
3  A 2.666667 PlaceX 
4  B 3.500000 PlaceY 
5  B 3.500000 PlaceY 

私の所望の出力は次のようになります。

Source: local data table [2 x 3] 

    event_id location mean_inc 
    (fctr) (fctr) (dbl) 
1  A PlaceX 2.666667 
2  B PlaceY 3.500000 
+1

この特定のインスタンスでは、 'location = unique(location)'のようなものを使用するか、 'group_by'に' location'を含めることができます。もっと複雑なユースケースがありますか? – aosmith

+0

ありがとう、しかし、私のデータには少なくとも100の変数があり、ソリューションはきれいにスケールアップするのが難しいようです。 – user2205916

+1

これは 'mutate'を使う方が良いかもしれないし、' summarize'の代わりに '.keep_all = TRUE'を使って' distinct'を使う方が良いかもしれないと思います。 – aosmith

答えて

1

私は私はあなたの欲望を理解している願っています。 (これらはgroup_by引数と1-1で一致していると仮定して)欠落している列を回復するためにinner_joinに行います。

newtest <- test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income)) %>% inner_join(test[-(1:2)]) 
#Joining by: "event_id" 
newtest 
#----------------- 
Source: local data table [3 x 4] 

    event_id mean_inc income location 
    (fctr) (dbl) (dbl) (fctr) 
1  A 2.666667  3 PlaceX 
2  A 2.666667  4 PlaceX 
3  B 3.500000  5 PlaceY 

それはあなたがたevent_idと場所の両方で一致したかったことも可能です:

test %>% 
    group_by(event_id,location) %>% 
    summarise(mean_inc = mean(income)) 
#--------- 
#Source: local data table [2 x 3] 
#Groups: event_id 

    event_id location mean_inc 
    (fctr) (fctr) (dbl) 
1  A PlaceX 2.666667 
2  B PlaceY 3.500000 
+1

2番目のアプローチでは、group_by_のSEバージョンは、1つのカラムを除いてすべてをグループ化したくて、たくさんある場合に便利です: 'test% >%group_by _(。dots = names(test)[ - 2])%>%summarize(mean_inc =平均(所得)) ' – alistaire

0

アンオプションはmutateを使用し、次にグループごとに1つの値を取り出し、distinct経由で行うことができます。

この有用性は、実際の使用例に依存します。これは、新しい変数が要約する元の変数と同じ名前を持つ場合に最も便利なようです。さもなければ、最終的なデータセットに元の、驚くほどのない変数を持つことになります。

distinctは、オブジェクトがまだグループ化されているため、ここで機能します。

test %>% 
    group_by(event_id) %>% 
    mutate(income = mean(income)) %>% 
    distinct() 

Source: local data table [2 x 3] 

    event_id income location 
    (fctr) (dbl) (fctr) 
1  A 2.666667 PlaceX 
2  B 3.500000 PlaceY 

dplyr_0.4.3.9000では、distinct.keep_all = TRUEが必要になります。

関連する問題