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 .
5 Réponses :
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
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)]
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
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 = ","))
}))
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
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