2017-04-07 29 views
1

これはかなりシンプルで解決策はありますが、多くの列があるので時間がかかります。私は他の解決策を見てきましたが、いつも少し違っていました(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) 

私の出力が「ROLL-ですPAT_IDごとに各列の最大値である「最大」レコードがあります。

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

これを行うには良い方法がありますが、しかしどのように?

答えて

1

summarize_alldplyrで実行できます。ここに行く

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_all()およびsummarise_each()は、 、mutate_at()、mutate_if()、summarise_all()、summarise_at()、およびsummarise_if()のいずれかである。だからここで 'summarize_all()'を使ったのです。 – MrFlick

+0

ありがとう!私はdplyrを再インストールし、それらのfnを得るためにセッションを再開しなければならなかった。新しい機能! :) – soporific

1

これは、aggregateを使用してベースRを使用して達成することもできます。

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 
関連する問題