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
1
alexvpickering 15 nov. 2017 à 19:19

4 réponses

Meilleure réponse

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
2
avid_useR 15 nov. 2017 à 18:53

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
0
www 15 nov. 2017 à 16:49

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
1
missuse 15 nov. 2017 à 16:34

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
2
YOBEN_S 15 nov. 2017 à 16:40
47312371