2017-06-18 2 views
0

私は、そのIDに対して観測された最大の値のみを合計で1回しか使用しないデータセット内の各タスクの合計を計算しようとしています。それが明確でない場合は、以下に希望する出力の例を示します。R:dplyrでの対応する一意のベクトルエントリの合計値

サンプルデータ

dat <- data.frame(task = rep(LETTERS[1:3], each=3), 
        id = c(rep(1:2, 4) , 3), 
        value = c(rep(c(10,20), 4), 5)) 
dat 
    task id value 
1 A 1 10 
2 A 2 20 
3 A 1 10 
4 B 2 20 
5 B 1 10 
6 B 2 20 
7 C 1 10 
8 C 2 20 
9 C 3  5 

私は作品の答えを見つけたが、それは、2つの別々のgroup_by()の機能を必要とします。単一のgroup_by()で同じ出力を得る方法はありますか?理由は、グループ化に敏感な他の要約されたメトリックがあり、同じパイプラインで2つの異なるgroup_by関数を実行できないためです。

dat %>% 
    group_by(task, id) %>% 
    summarize(v = max(value)) %>% 
    group_by(task) %>% 
    summarize(unique_ids = n_distinct(id), 
      value_sum = sum(v)) 

# A tibble: 3 × 3 
    task unique_ids value_sum 
    <chr>  <int>  <dbl> 
1  A   2  30 
2  B   2  30 
3  C   3  35 

答えて

1

私はtapply()を使用して動作するものを見つけました。

dat %>% 
    group_by(task) %>% 
    summarize(unique_ids = length(unique(id)), 
      value_sum = sum(tapply(value, id, FUN = max))) 

# A tibble: 3 × 3 
    task unique_ids value_sum 
    <chr>  <int>  <dbl> 
1  A   2  30 
2  B   2  30 
3  C   3  35 
+2

Fyi、長さ(一意(x))のnplyはdplyrにあります。私はこれが重複を削除することで解決できると思います: 'dat%>%distinct%>%group_by(task)%>%summarize(n = n()、s =合計(value))'。他のメトリックがその範囲内に入る限り、実際には複数の(たとえば、 'id'とその属性のために1つの)テーブルを使用する必要があるときに、1つのテーブルを使用するという決定から来ていると思います。あなたは、 "整頓されたデータ"についてHadleyの論文を読むことをお勧めします。 – Frank

+0

n_distinctのヒントをありがとう。私は要約する必要がある他の列が保持されているすべての行に依存するため、重複する行を削除できません。 –

関連する問題