J'ai un assez grand Dataframe structuré comme ceci: J'ai besoin de créer un fichier de données comme celui-ci: P> id xsource xvalue yvalue zvalue v
1 x1 2 10 200 2.5
1 x2 4 20 150 2.5
1 x3 5 15 170 2.5
2 x1 3 25 300 4.2
2 x2 7 35 350 4.2
2 x3 6 40 400 4.2
5 Réponses :
Quelqu'un s'il vous plaît prouver moi vous trompez, mais je ne pense pas qu'il soit facile de résoudre ce problème à l'aide de l'emballage code> Remonter code> ou de la base , il est assez facile à l'aide de réplique les données: p> Faites l'analyse p> Remoder code> fonction.
lapply code> et
do.call code>: p>
Je suis d'accord que celui-ci est un peu plus compliqué qu'à première vue. Je pense que vous manquez la colonne ID cependant. C'est un problème intéressant et moi-même espérons qu'une solution plus rapide de Néater.
@Tylerinker Merci d'avoir souligné la colonne ID manquante. J'ai édité la réponse pour corriger ceci.
Voici la solution Le bit de clé est que l'argument Enfin, deux étapes purement cosmétiques sont nécessaires pour obtenir les résultats exactement < / em> comme indiqué dans votre question: p> Remoape () code>.
variable = code> peut prendre une liste de vecteurs de noms de colonne dans le format large qui correspond aux variables simples au format long. Dans ce cas, les colonnes
"x1", "x2", "x3" code> dans la trame de données d'origine sont envoyées à une colonne de la trame de données longue, colonnes
"y1, y2, y2" code> entrera dans une deuxième colonne, et ainsi de suite. p>
Merci Josh! Toujours un problème. Votre solution fonctionne parfaitement sur cet exemple, mais lorsque je l'applique à mon vrai Dataframe, l'erreur "[.data.frame` (données, variant [[i]] [1L]): Les colonnes non définies sélectionnées" se produisent. Toute suggestion?
Problème résolu! Merci beaucoup, votre solution fonctionne parfaitement!
Voici une approche qui utilise Étape 1: Identifiez les variables déjà dans des colonnes. Dans ce cas: ID et v. Ce sont les variables que nous fondons par P> étape 2: diviser les variables qui sont actuellement combinées dans une colonne. Dans ce cas, la source (la partie de caractère) et le représentant (la partie entière): p> Il y a beaucoup de façons de le faire, je vais utiliser une extraction de chaîne avec le reshape2 code> et est décrite en profondeur dans mon document sur Données bien rangées .
stringr Code> Package P>
dcast(xm, ... ~ source)
# id v rep x y z
# 1 1 2.5 1 2 10 200
# 2 1 2.5 2 4 20 150
# 3 1 2.5 3 5 15 170
# 4 2 4.2 1 3 25 300
# 5 2 4.2 2 7 35 350
# 6 2 4.2 3 6 40 400
Essayez d'utiliser le paquet ReshapeGui. Il utilise le package Plyr et le package Reshape2 et vous fournit une interface facile à utiliser qui vous permet de prévisualiser votre remodelage avant de l'exécuter. Cela vous donne également le code pour le remodelage que vous faites pour que vous puissiez la coller dans votre script pour la reproducabilité et vous pouvez ainsi apprendre à utiliser les commandes de la fusion et de la distribution à Remeape2. C'est une belle béquille pour des manipulations de données complexes comme celle-ci pour ceux qui ne sont pas remodelés Ninjas. P>
Voici deux approches plus récentes qui pourraient intéresser une personne qui lise cette question:
Option 1: Tidyverse P>
library(data.table) setDT(x) melt(x, measure.vars = patterns("x", "y", "z"), value.name = c("x", "y", "z"), variable.name = "source") # id v source x y z # 1: 1 2.5 1 2 10 200 # 2: 2 4.2 1 3 25 300 # 3: 1 2.5 2 4 20 150 # 4: 2 4.2 2 7 35 350 # 5: 1 2.5 3 5 15 170 # 6: 2 4.2 3 6 40 400