J’ai un bloc de données avec une variable de regroupement (“Gene”) et une variable de valeur (“Value”):
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 doit 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
L’ aggregate
pourrait-il faire l’affaire?
Il y a beaucoup de possibilités pour faire cela dans R. En voici quelques unes:
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))),]
Utiliser sqldf et standard sql 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
Utiliser l’excellent paquet Hmisc pour une application groupby de la fonction (max) https://www.rdocumentation.org/packages/Hmisc/versions/4.0-3/topics/summarize
library(Hmisc) summarize(df1$Value,df1$Gene,max)
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