2017-04-07 42 views
1

這看起來相當簡單,我有一個解決方案,但是由於我有很多列,所以這有點費時。我已經看過其他的解決方案,但總是有些不同的地方(聚合一列,改變所有列等)。在SQL中,我會做select PAT_ID, max(X), max(Y), max(Z) from table_name group by PAT_ID總結記錄,每列最大值,group_by R

我有一個數據集,看起來像這樣(但更多的列):

dt <- data.frame(
    PAT_ID = c('P','P','P','A','A','A'), 
    X = c(1,NA,NA, 1,NA,NA), 
    Y = c(NA,2,NA,NA,1,NA), 
    Z = c(NA,NA,1,NA,NA,0) 
) 

所以我總結,然後合併結果:

results_X <-dt %>%        
    group_by(PAT_ID) %>%       
    summarise(X = max(X, na.rm=TRUE)) 

results_Y <-dt %>%        
    group_by(PAT_ID) %>%      
    summarise(Y = max(Y, na.rm=TRUE)) 

results_Z <-dt %>%        
    group_by(PAT_ID) %>%      
    summarise(Z = max(Z, na.rm=TRUE)) 

resulted <- left_join(results_X, results_Y) 
resulted <- left_join(resulted, results_Z) 

我的輸出是「卷子up「記錄,即每個PAT_ID每列的最大值:

myresult <- data.frame(
    PAT_ID = c('P','A'), 
    X = c(1,1), 
    Y = c(2,1), 
    Z = c(1,0) 
    ) 

我確定有更好的方法來做到這一點,但是如何?

回答

1

這可以通過dplyr中的summarize_all完成。在這裏你去

library(dplyr) 
dt %>% group_by(PAT_ID) %>% summarize_all(max, na.rm=T) 
# PAT_ID  X  Y  Z 
# <fctr> <dbl> <dbl> <dbl> 
# 1  A  1  1  0 
# 2  P  1  2  1 
+0

summarise_each(funs(max(。,na.rm = TRUE)))...謝謝!我沒有意識到summarise_each不適用於變量組。只需注意語法的小編輯 – soporific

+0

@soporific請注意'?summarise_each'幫助頁面上的消息:「將來mutate_each()和summarise_each()將被棄用,以支持更多功能的函數系列:mutate_all() ,mutate_at(),mutate_if(),summarise_all(),summarise_at()和summarise_if()。「這就是爲什麼我在這裏使用'summarize_all()'。 – MrFlick

+0

哦,謝謝!我必須重新安裝dplyr並重新啓動會話才能獲得這些fns。新功能! :) – soporific

1

這也可以用基地R使用aggregate完成。

aggregate(dt[c("X","Y","Z")], dt["PAT_ID"], FUN=max, na.rm=TRUE) 
    PAT_ID X Y Z 
1  A 1 1 0 
2  P 1 2 1