Exemple data.frame:
df <- data.frame(study = c('A', 'A', 'B', 'C', 'D', 'D'),
similarity = c(0.61, 0.58, -0.605, 0.4, 0.607, 0.3))
df
study similarity
1 A 0.610
2 A 0.580
3 B -0.605
4 C 0.400
5 D 0.607
6 D 0.300
Je veux classer par absolu similarity
, mais en gardant des valeurs d'étude égales ensemble. Pour l'exemple ci-dessus, le résultat devrait être:
study similarity
1 A 0.610
2 A 0.580
5 D 0.607
6 D 0.300
3 B -0.605
4 C 0.400
4 réponses
data.table
solution:
library(data.table)
setDT(df)[order(-abs(similarity)), .SD, by = study]
Résultat:
study similarity
1: A 0.610
2: A 0.580
3: D 0.607
4: D 0.300
5: B -0.605
6: C 0.400
Une solution utilisant dplyr
. Cette solution semble plus compliquée que d'autres, mais elle vise à générer la sortie attendue même si la colonne study
n'est pas dans l'ordre, ou s'il y a des liens dans similarity
d'un groupe study
différent.
Tout d'abord, calculez la valeur absolue de chaque similarité (df2
).
Deuxièmement, calculez le maximum absolu de chaque étude (df3
).
Troisièmement, convertissez la colonne d'étude en une colonne de facteurs en fonction de l'ordre dans df3
. Réorganisez les colonnes en fonction de study
et de la valeur absolue (df4
)
library(dplyr)
df2 <- df %>% mutate(ABS = abs(similarity))
df3 <- df2 %>%
group_by(study) %>%
summarise(Max_ABS = max(ABS)) %>%
arrange(desc(Max_ABS))
df4 <- df2 %>%
mutate(study = factor(study, levels = df3$study)) %>%
arrange(study, desc(ABS)) %>%
select(-ABS)
df4
# study similarity
# 1 A 0.610
# 2 A 0.580
# 3 D 0.607
# 4 D 0.300
# 5 B -0.605
# 6 C 0.400
Voici une approche utilisant tidyverse
library(tidyverse)
df %>%
group_by(study) %>% #group by study
mutate(arr = max(abs(similarity))) %>% #get maximum absolute similarity by group
ungroup() %>%
arrange(desc(arr)) %>% #arrange according to by group maximum absolute similarity
select(-arr) #leave the helper column out
#ouput
# A tibble: 6 x 2
study similarity
<fctr> <dbl>
1 A 0.610
2 A 0.580
3 D 0.607
4 D 0.300
5 B -0.605
6 C 0.400
En base R
df[order(-ave(df$similarity,df$study,FUN=function(x) max(abs(x))),df$study),]
study similarity
1 A 0.610
2 A 0.580
5 D 0.607
6 D 0.300
3 B -0.605
4 C 0.400
Questions connexes
De nouvelles questions
r
R est un langage de programmation et un environnement logiciel libres et open source pour le calcul statistique, la bioinformatique, la visualisation et le calcul général. Veuillez fournir des exemples minimaux et reproductibles ainsi que le résultat souhaité. Utilisez dput () pour les données et spécifiez tous les packages non basiques avec des appels à library (). N'incorporez pas d'images pour les données ou le code, utilisez plutôt des blocs de code en retrait. Pour les questions relatives aux statistiques, utilisez https://stats.stackexchange.com.