web-dev-qa-db-fra.com

Extraire la valeur maximale au sein de chaque groupe dans une base de données

J'ai un bloc de données avec une variable de regroupement ("Gene") et une variable de valeur ("Valeur"):

Gene   Value
A      12
A      10
B      3
B      5
B      6
C      1
D      3
D      4

Pour chaque niveau de ma variable de regroupement, je souhaite extraire la valeur maximale. Le résultat devrait donc être un bloc de données avec une ligne par niveau de la variable de regroupement:

Gene   Value
A      12
B      6
C      1
D      4

Est-ce que aggregate pourrait faire l'affaire?

58
Johnathan

Il y a beaucoup de possibilités de le faire dans R. Voici quelques-unes d'entre elles:

df <- read.table(header = TRUE, text = 'Gene   Value
A      12
A      10
B      3
B      5
B      6
C      1
D      3
D      4')

# aggregate
aggregate(df$Value, by = list(df$Gene), max)
aggregate(Value ~ Gene, data = df, max)

# tapply
tapply(df$Value, df$Gene, max)

# split + lapply
lapply(split(df, df$Gene), function(y) max(y$Value))

# plyr
require(plyr)
ddply(df, .(Gene), summarise, Value = max(Value))

# dplyr
require(dplyr)
df %>% group_by(Gene) %>% summarise(Value = max(Value))

# data.table
require(data.table)
dt <- data.table(df)
dt[ , max(Value), by = Gene]

# doBy
require(doBy)
summaryBy(Value~Gene, data = df, FUN = max)

# sqldf
require(sqldf)
sqldf("select Gene, max(Value) as Value from df group by Gene", drv = 'SQLite')

# ave
df[as.logical(ave(df$Value, df$Gene, FUN = function(x) x == max(x))),]
131
EDi
df$Gene <- as.factor(df$Gene)
do.call(rbind, lapply(split(df,df$Gene), function(x) {return(x[which.max(x$Value),])}))

Juste en utilisant la base R

2
Kalees Waran

Utiliser sqldf et sql standard pour obtenir les valeurs maximales regroupées par une autre variable

https://cran.r-project.org/web/packages/sqldf/sqldf.pdf

library(sqldf)
sqldf("select max(Value),Gene from df1 group by Gene")

ou

Utilisation de l'excellent paquet Hmisc pour une application groupby de function (max) https://www.rdocumentation.org/packages/Hmisc/versions/4.0-3/topics/summarize

library(Hmisc)
summarize(df1$Value,df1$Gene,max)
2
Ajay Ohri