汇总记录,每列的最大值,按R分组

汇总记录,每列的最大值,按R分组,r,group-by,max,R,Group By,Max,这看起来相当简单,我有一个解决方案,但由于我有很多专栏,这相当耗时。我看过其他的解决方案,但总是有一些稍微不同的方法聚合一个列,变异所有列等。在SQL中,我会按PAT_ID从table_name group中选择PAT_ID、maxX、maxY、maxZ 我有一个数据集,看起来像这样,但有更多的列: dt <- data.frame( PAT_ID = c('P','P','P','A','A','A'), X = c(1,NA,NA, 1,NA,NA), Y = c(NA,2

这看起来相当简单,我有一个解决方案,但由于我有很多专栏,这相当耗时。我看过其他的解决方案,但总是有一些稍微不同的方法聚合一个列,变异所有列等。在SQL中,我会按PAT_ID从table_name group中选择PAT_ID、maxX、maxY、maxZ

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

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)
我的输出是汇总记录,它是每个PAT_ID的每列的最大值:

   myresult <- data.frame(
    PAT_ID = c('P','A'),
    X = c(1,1),
    Y = c(2,1),
    Z = c(1,0)
    )
我相信有更好的方法可以做到这一点,但如何做到呢?

这可以通过一个全在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

这也可以通过使用骨料的基本R来实现


总结每一个例子,na.rm=TRUE。。。谢谢我没有意识到每个汇总都不适用于分组变量。只需注意对syntax@soporific请注意?Summary_each帮助页面上的消息:将来,mutate_each和Summary_each将被弃用,取而代之的是更具特色的函数系列:mutate_all、mutate_at、mutate_if、Summary_all、Summary_at和Summary_if。这就是为什么我把你们都用在这里。哦,谢谢!我必须重新安装dplyr并重新启动会话才能获得这些FN。新功能!:
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