汇总记录,每列最多,group_by R

时间:2017-04-07 16:12:30

标签: r group-by max

这看起来相当简单,我有一个解决方案,但由于我有很多专栏,所以有点费时。我已经看过其他解决方案了,但它总是有一些不同的东西(聚合一列,改变所有列等)。在SQL中我会做select PAT_ID, max(X), max(Y), max(Z) from table_name group by PAT_ID

我有一个看起来像这样的数据集(但有更多列):

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)

我的输出是&#34;汇总&#34;记录,即每个PAT_ID的每列的最大值:

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

我确定有更好的方法可以做到这一点,但是怎么做?

2 个答案:

答案 0 :(得分:1)

可以使用summarize_all中的dplyr来完成此操作。你去吧

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

答案 1 :(得分:1)

这也可以使用webpack --watch基础R来完成。

aggregate