如何在每个组中选择具有最大值的行

如何在每个组中选择具有最大值的行

目前我有一个问题如下。在每个主题存在多个观察的数据集中,我希望在该数据集的子集中只选择记录的最大数据。例如,对于数据集,如下所示:

ID <- c(1,1,1,2,2,2,2,3,3)Value <- c(2,3,5,2,5,8,17,3,5)Event <- c(1,1,2,1,2,1,2,2,2)group <- data.frame(Subject=ID, pt=Value, Event=Event)

被试1、2和3的最大pt值分别为5、17和5。首先,如何找到每个主题的最大pt值,然后将这个观察结果放到另一个数据框架中?这意味着这个子集对于每个主题只有最大的pt值。


FFIVE
浏览 489回答 3
3回答

森林海

这是一个data.table解决办法:require(data.table)&nbsp;##&nbsp;1.9.2group&nbsp;<-&nbsp;as.data.table(group)如果要保留与pt在每一组中:group[group[,&nbsp;.I[pt&nbsp;==&nbsp;max(pt)],&nbsp;by=Subject]$V1]#&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;pt&nbsp;Event#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;3:&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2如果您想要的第一个最大值pt:group[group[,&nbsp;.I[which.max(pt)],&nbsp;by=Subject]$V1]#&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;pt&nbsp;Event#&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;2:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2#&nbsp;3:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2在这种情况下,这并没有什么区别,因为数据中的任何组中都没有多个最大值。

桃花长相依

最直观的方法是在dplyr中使用group_by和top_n函数。&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;%>%&nbsp;group_by(Subject)&nbsp;%>%&nbsp;top_n(1,&nbsp;pt)你得到的结果是&nbsp;&nbsp;&nbsp;&nbsp;Source:&nbsp;local&nbsp;data&nbsp;frame&nbsp;[3&nbsp;x&nbsp;3] &nbsp;&nbsp;&nbsp;&nbsp;Groups:&nbsp;Subject&nbsp;[3] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;&nbsp;&nbsp;&nbsp;pt&nbsp;Event&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(dbl)&nbsp;(dbl)&nbsp;(dbl) &nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2

芜湖不芜

使用的较短的解决方案data.table:setDT(group)[, .SD[which.max(pt)], by=Subject]#&nbsp; &nbsp; Subject pt Event# 1:&nbsp; &nbsp; &nbsp; &nbsp;1&nbsp; 5&nbsp; &nbsp; &nbsp;2# 2:&nbsp; &nbsp; &nbsp; &nbsp;2 17&nbsp; &nbsp; &nbsp;2# 3:&nbsp; &nbsp; &nbsp; &nbsp;3&nbsp; 5&nbsp; &nbsp; &nbsp;2
打开App,查看更多内容
随时随地看视频慕课网APP