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) })
3 Réponses :
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 La fonction data.table code>. P>
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)]
}
Un moyen différent d'illustrer: mais notez que les noms de colonne proviennent du premier groupe (peuvent être renommés ultérieurement à l'aide de setnames code>). 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. P> p>
MatthewDowle, c'est définitivement i> 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!
Qu'en est-il de quelque chose comme celui-ci si vous souhaitez aller plus loin et que vous pouvez faire fondre cette donnée, vous pouvez utiliser le package de fusion p>