识别并标注每个组中的最大数字

嗨,我想识别和标签为每个组最大的数字,有人可以告诉我如何完成这个r(或者也许Excel会更容易)? 以下是一个示例数据,原始数据仅包含左侧2列,我想生成第三个数据。 在第三列中,我想将组中的最大值标记为1,例如在组1中,最大值是.02874,因此标记为1,否则为0.谢谢!

x <- read.table(header=T, text="group value largest 1 0.02827 0 1 0.02703 0 1 0.02874 1 2 0.03255 0 2 0.10394 1 2 0.03417 0 3 0.13858 0 3 0.16084 0 3 0.99830 1 3 0.24563 0") 

更新:谢谢大家的帮助! 他们都是很好的解决scheme!

最后,基地(不需要包裹)的方法:

 is.largest <- function(x) as.integer(seq_along(x) == which.max(x)) x <- transform(x, largest = ave(value, group, FUN = is.largest)) 

请注意,如果我是你,我会删除as.integer并只存储一个逻辑( TRUE / FALSE )向量。

 library(data.table) x <- data.table(x) y <- x[,list(value = max(value), maxindicator = TRUE), by = c('group')] z <- merge(x,y, by = c('group','value'), all = TRUE) 

产量

 > z group value largest maxindicator 1: 1 0.02703 0 NA 2: 1 0.02827 0 NA 3: 1 0.02874 1 TRUE 4: 2 0.03255 0 NA 5: 2 0.03417 0 NA 6: 2 0.10394 1 TRUE 7: 3 0.13858 0 NA 8: 3 0.16084 0 NA 9: 3 0.24563 0 NA 10: 3 0.99830 1 TRUE 

这是plyr的解决scheme:

 x$largest <- 0 x <- ddply(x, .(group), function(df) { df$largest[which.max(df$value)] <- 1 df }) 

和一个基地R:

 x$largest <- 0 l <- split(x, x$group) l <- lapply(l, function(df) { df$largest[which.max(df$value)] <- 1 df }) x <- do.call(rbind, l) 

这是一个不太酷的基本方法:

 FUN <- function(x) {y <- rep(0, length(x)); y[which.max(x)] <- 1; y} x$largest <- unlist(tapply(x$value, x$group, FUN)) ## group value largest ## 1 1 0.02827 0 ## 2 1 0.02703 0 ## 3 1 0.02874 1 ## 4 2 0.03255 0 ## 5 2 0.10394 1 ## 6 2 0.03417 0 ## 7 3 0.13858 0 ## 8 3 0.16084 0 ## 9 3 0.99830 1 ## 10 3 0.24563 0 

在基地做比我想象的更困难。