如何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