2017-06-18 45 views
0

我想爲數據集中的每個任務想出一個總和,該數據集只使用總和中一次觀察到的最大值。如果還不清楚,我提供了一個下面所需輸出的例子。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 

我找到問題的答案,但它需要兩個獨立的group_by()功能。有沒有辦法讓一個group_by()獲得相同的輸出?原因是我有其他彙總度量標準對分組很敏感,我不能在同一個管道中運行兩個不同的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,長度(unique(x))在dplyr中有n_distinct。我認爲這可以通過刪除重複項來解決:'dat%>%distinct%>%group_by(task)%>%summarize(n = n(),s = sum(value))''。就其他度量方式阻礙這一點而言,我認爲這來自於確實應該有多個表(例如,用於'id's及其屬性)的決定。您可能想閱讀哈德利關於「整理數據」的論文 – Frank

+0

感謝您提供'n_distinct'的提示。我不能刪除重複的行,因爲我需要總結的其他列取決於所保留的所有行。 –