2
votes

Regrouper par colonne, conserver la valeur minimale, concaténer les valeurs sélectionnées

J'ai un bloc de données qui ressemble à ceci:

require(plyr)
new_df[new_df$inerror == ddply(new_df, .(intype), summarise, Value = min(inerror))$Value,]

Je voudrais créer un nouveau bloc de données qui ne conservera que la meilleure méthode avec le minimum d'erreur mais sur les liens, je voudrais aiment concaténer les meilleures méthodes. Le bloc de données résultant devrait ressembler à ceci:

+--------+---------+----------+
| intype | inerror | inmethod |
+--------+---------+----------+
| A30    |    0.14 |        B |
| A31    |    0.00 |      A,C |
+--------+---------+----------+

Actuellement, j'utilise

new_df <- structure(list(intype = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A30", 
    "A31"), class = "factor"), inerror = c(0.54, 0.14, 0.94, 0, 2.11, 
    0), inmethod = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
    "B", "C"), class = "factor")), class = "data.frame", row.names = c(NA, 
    -6L))

Mais cela ne fonctionne pas .


2 commentaires

veuillez ne pas mettre les data.frames dans ce format. tapez dput (data) et ajoutez le résultat de celui-ci dans votre question (pas dans un commentaire)


Mise à jour de la question ... Merci


5 Réponses :


2
votes

Voici une façon d'utiliser dplyr -

new_df %>% 
  group_by(intype) %>% 
  filter(inerror == min(inerror)) %>% 
  group_by(intype, inerror) %>% 
  summarise(inmethod = toString(inmethod)) %>% 
  ungroup()

# A tibble: 2 x 3
intype inerror inmethod
<chr>    <dbl> <chr>   
1 A30       0.14 B       
2 A31       0    A, C


0 commentaires

1
votes

En utilisant data.table , vous pouvez effectuer les opérations suivantes:

library(data.table)
setDT(new_df)[, paste(inmethod[inerror==min(inerror)], collapse=", "), by=.(intype)]


0 commentaires

2
votes

Une autre solution tidyverse légèrement différente de celle de Shree:

df %>%
  group_by(intype, inerror) %>%
  summarise(inmethod = toString(inmethod)) %>%
  arrange(intype, inerror) %>%
  distinct(intype, .keep_all = T)

# A tibble: 2 x 3
# Groups:   intype [2]
  intype inerror inmethod
  <fct>    <dbl> <chr>   
1 A30       0.14 B       
2 A31       0    A, C    


0 commentaires

1
votes

Pour être complet, une solution de base R:

do.call(rbind, lapply(split(new_df, new_df$intype),  function(x) {
  x <- x[x$inerror == min(x$inerror), ]
  data.frame(intype = x$intype[1], 
             inerror = x$inerror[1], 
             inmethod = paste0(x$inmethod, collapse = ","))
}))


0 commentaires

2
votes

Pas une réponse élégante, mais en utilisant data.table

df <- data.table(df)
df <- df[df[,.(inerror == min(inerror)), .(intype)]$V1]
df <- df[, inmethod := toString(inmethod), .(intype)]
df <- unique(df)
df

   intype inerror inmethod
1:    A30    0.14        B
2:    A31    0.00     A, C


0 commentaires