如何select每个组中具有最大值的行
目前我有一个问题如下。 在一个数据集中,每个主题都有多个观察值,我想创build一个只有最大数据logging的数据集。 例如,对于一个数据集如下:
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。 我怎么能先find每个主题的最大pt值,然后将这个观察值放在另一个数据框中? 这意味着这个子集只有每个主题的最大pt值。
这是一个data.table
解决scheme:
require(data.table) ## 1.9.2 group <- as.data.table(group)
如果您想保留每个组中对应于最大pt
值的所有条目:
group[group[, .I[pt == max(pt)], by=Subject]$V1] # Subject pt Event # 1: 1 5 2 # 2: 2 17 2 # 3: 3 5 2
如果你只想得到pt
的第一个最大值:
group[group[, .I[which.max(pt)], by=Subject]$V1] # Subject pt Event # 1: 1 5 2 # 2: 2 17 2 # 3: 3 5 2
在这种情况下,它不会有什么不同,因为数据中的任何组中都没有多个最大值。
最直观的方法是在dplyr中使用group_by和top_n函数
group %>% group_by(Subject) %>% top_n(1, pt)
你得到的结果是
Source: local data frame [3 x 3] Groups: Subject [3] Subject pt Event (dbl) (dbl) (dbl) 1 1 5 2 2 2 17 2 3 3 5 2
使用data.table
更短的解决scheme:
setDT(group)[, .SD[which.max(pt)], by=Subject] # Subject pt Event # 1: 1 5 2 # 2: 2 17 2 # 3: 3 5 2
我不确定你想要做什么事情栏,但如果你想保持这一点,那么怎么样
isIDmax <- with(dd, ave(Value, ID, FUN=function(x) seq_along(x)==which.max(x)))==1 group[isIDmax, ] # ID Value Event # 3 1 5 2 # 7 2 17 2 # 9 3 5 2
这里我们用大家看看每个“ID”的“Value”列。 然后我们确定哪个值是最大的,然后把它转换成一个逻辑向量,我们可以用它来对原始数据进行子集化。
解决scheme:
> library(dplyr) > 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) > group <- group_by(group, Subject) > summarize(group, max.pt = max(pt))
这产生以下数据框架:
Subject max.pt 1 1 5 2 2 17 3 3 5
do.call(rbind, lapply(split(group,as.factor(group$Subject)), function(x) {return(x[which.max(x$pt),])}))
使用基地R
另一种select是slice
library(dplyr) group %>% group_by(Subject) %>% slice(which.max(pt)) # Subject pt Event # <dbl> <dbl> <dbl> #1 1 5 2 #2 2 17 2 #3 3 5 2