6
votes

Opérations d'exécution sur un sous-ensemble à l'aide de la table de données

J'ai un ensemble de données d'enquête sur une forme large. Pour une question particulière, un ensemble de variables a été créé dans les données brutes pour représenter différemment le fait que la question de l'enquête a été posée sur un mois donné.

Je souhaite créer un nouvel ensemble de variables qui ont des noms invariants de mois; La valeur de ces variables correspondra à la valeur d'une voix variante de mois pour le mois observé. p>

Veuillez consulter un exemple d'exemple / fictif de données: P>

require(plyr)
data <- data.frame(data)

mdata <- ddply(data, .(month), function(dfmo) {
    dfmo <- dfmo[, c(1, grep(dfmo$month[1], names(dfmo)))]
    names(dfmo) <- gsub(paste0(dfmo$month[1], '\\.'), '', names(dfmo))
    return(dfmo)
})


0 commentaires

3 Réponses :


3
votes

edit: strong> semble très inefficace sur des données plus grandes. Découvrez la réponse de @ Matthewdowle pour un solution très rapide et nette em>.

Voici une solution utilisant data.table code>. P> xxx pré>

La fonction melt.dt code> est une petite fonction (encore plus d'améliorations à apporter) j'ai écrit à Melt code> A datable.table code> similaire à celui de la fonction fond code> dans plyr code> (copier / coller cette fonction indiquée ci-dessous avant d'essayer le code ci-dessus). P>

melt.dt <- function(DT, id.var) {
    stopifnot(inherits(DT, "data.table"))
    measure.var <- setdiff(names(DT), id.var)
    ind <- rep.int(measure.var, rep.int(nrow(DT), length(measure.var)))
    m1  <- lapply(c("list", id.var), as.name)
    m2  <- as.call(lapply(c("factor", "ind"), as.name))
    m3  <- as.call(lapply(c("c", measure.var), as.name))    
    quoted <- as.call(c(m1, ind = m2, values = m3))
    DT[, eval(quoted)]
}


0 commentaires

6
votes

Un moyen différent d'illustrer: xxx

mais notez que les noms de colonne proviennent du premier groupe (peuvent être renommés ultérieurement à l'aide de setnames ). Et ce n'est peut-être pas le plus efficace s'il existe un grand nombre de colonnes avec seulement quelques-unes nécessaires. Dans ce cas, la solution d'Arun fusion au format long devrait être plus rapide.


1 commentaires

MatthewDowle, c'est définitivement plus rapide que (ma) fondre + moulée. J'ai essayé de plus en plus de données. Le mien n'est pas de près ... Il faut 23 secondes sur une colonne 1E5 * 100 alors que cela le fait en moins d'une seconde!



1
votes

Qu'en est-il de quelque chose comme celui-ci xxx

si vous souhaitez aller plus loin et que vous pouvez faire fondre cette donnée, vous pouvez utiliser le package de fusion xxx


0 commentaires