2013-10-10 68 views
0

嗨我想識別並標記每個組的最大數字,有人可以告訴我如何在r中完成此操作(或者可能會更容易)? 以下是一個示例數據,原始數據僅包含左側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") 

更新:謝謝大家的幫助!他們都是偉大的解決方案!

+2

你能告訴我們你試過了什麼嗎?乾杯。 – Henrik

+1

我們可以添加更多的方法嗎?不確定是否有足夠的選項可供選擇。 –

回答

4

最後,所述基部(無包所需)方法:

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)載體。

2
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 
+3

嗯,這是很多額外的東西,我只是做'x [,maxindicator:= 1 *(value == max(value)),by = group]' – eddi

+0

+1,我想如果條件限制爲無論是'[],還是需要在'.SD'中進行評估。 – TheComeOnMan

1

這裏是plyr溶液:

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) 
1

這裏有一個不太爽基地的做法:

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 

這是比較難的基礎比我預想的事情。

相關問題